免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1944 | 回复: 3
打印 上一主题 下一主题

Finally solve 百度语言翻译机 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-18 22:00 |只看该作者 |倒序浏览
百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套独特的缩略语。他们在平时的交谈、会议,甚至在各种技术文档中都会大量运用。

为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决定开发一套专用的翻译系统,把相关文档中的缩略语和专有名词翻译成日常语言。

输入要求:
输入数据包含三部分:
1. 第一行包含一个整数N(N<=10000),表示总共有多少个缩略语的词条;
2. 紧接着有N行的输入,每行包含两个字符串,以空格隔开。第一个字符串为缩略语(仅包含大写英文字符,长度不超过10字节),第二个字符串为日常语言(不包含空格,长度不超过255字节);
3. 从第N+2开始到输入结束为包含缩略语的相关文档(总长度不超过1000000个字节)。例:
6
PS 门户搜索部
NLP 自然语言处理
PM 产品市场部
HR 人力资源部
PMD 产品推广部
MD 市场发展部
百度的部门包括PS,PM,HR,PMD,MD等等,其中PS还包括NLP小组。
样例:in.txt

输出要求:
输出将缩略语转换成日常语言后的文档。(将缩略语转换成日常语言,其他字符保留原样)。例:
百度的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等,其中门户搜索部还包括自然语言处理小组。
样例:out.txt

评分规则:
1.程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过10秒,否则该用例不得分;
2.要求程序能按照输入样例的格式读取数据文件,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
3.该题目共有4个测试用例,每个测试用例为一个输入文件。各测试用例占该题目分数的比例分别为25%,25%,25%,25%;
4.该题目20分。

注意事项:
1.输入数据是中英文混合的,中文采用GBK编码。
GBK:是又一个汉字编码标准,全称《汉字内码扩展规范》。采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,排除xx7F。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。

2.为保证答案的唯一性,缩略语的转换采用正向最大匹配(从左到右为正方向)原则。请注意样例中PMD的翻译。

论坛徽章:
0
2 [报告]
发表于 2006-06-18 22:01 |只看该作者

my code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include <iconv.h>


#define max 100

struct BaiduLang
{
        char f[10];
        char s[255];
};
typedef struct BaiduLang BL;
//quickly sort
int partition(BL langs[],int low,int high);
void Qsort(BL langs[],int low,int high);

//search by key using binary search
int Search(BL langs[],char *key,int n)
{
        int mid,low,high;
        low=0;
        high=n-1;
        int flag;
        while(low<=high)
        {
                mid=(low+high)/2;
                flag=strcmp(key,langs[mid].f);
                if(flag==0)
                        return mid;
                else if(flag>0)
                        high=mid-1;
                else
                        low=mid+1;
                //fprintf(stderr,"key");
        }
        //printf("%d %d\n",low,high);
        if(low>high)
        {
                fprintf(stderr,"can not find key\n");
                return -1;
        }
        else
                return mid;
}
int readfromfile(FILE *file,BL langs[],char *result)
{
        int i=0;
        int j=0;
        int n;
        if(fscanf(file,"%d",&n)==-1)
        {
                fprintf(stderr,"failed to read n \n");
                return -1;
        }
        BL temps[n+1];
        for(i=0;i<n+1;i++)
        {
                if(i==0)
                        continue;
                fscanf(file,"%s",langs[j].f);
                fscanf(file,"%s",langs[j].s);
                j++;
        }
        fscanf(file,"%s",result);
        return n;
}

////////////////////////////////////////////////////
/*******************quickly sort*******************/
int partition(BL *langs,int i,int j)
{
        int low=i;
        int high=j;
        char pk[10];
        char record[255];
        strcpy(pk,langs[i].f);
        strcpy(record,langs[i].s);
        while(low<high)
        {
                while((low<high) && (strcmp(pk,langs[high].f)>=0))
                        high=high-1;
                strcpy(langs[low].f,langs[high].f);
                strcpy(langs[low].s,langs[high].s);
                while((low<high) && (strcmp(pk,langs[low].f)<=0))
                        low=low+1;
                strcpy(langs[high].f,langs[low].f);
                strcpy(langs[high].s,langs[low].s);
        }
        strcpy(langs[low].f,pk);
        strcpy(langs[low].s,record);
        return low;
}
void Qsort(BL *langs,int low,int high)
{
        int i;
        if(low<high)
        {
                i=partition(langs,low,high);
                Qsort(langs,low,i-1);
                Qsort(langs,i+1,high);
        }
}
////////////////////////////////////////////////////

int main()
{
        BL langs1[max];
        BL *langs;
        char *result;
        char *real;
        if((result=(char *)malloc(1000000))==NULL || (real=(char *)malloc(1000000))==NULL)
        {
                printf("failed to malloc\n");
                return 1;
        }
        int n;
        size_t i,j,k;
        i=j=k=0;
        FILE *file=fopen("in.txt","r");
        n=readfromfile(file,langs1,result);
        langs=langs1;
        Qsort(langs,0,n-1);
        int count=0;
        while(result[i]!='\0')   
    {
        char temp[10]="";
        while(isupper(*(result+i)) && isalpha(*(result+i)))
                {
                        //printf("%d ",isupper(*(result+i)));
                        //printf("[%d]",i);
                        temp[j]=result[i];
                        j=j+1;
                        i++;
                }
                if(j>0)
                {
                        //printf("%s\n",temp);
                        int index=Search(langs,temp,n);
                        //printf("%d\n",index);
                        if(index!=-1)
                        {
                                int len=strlen(langs[index].s);
                                strcat(real,langs[index].s);
                                k=k+len;
                        }
                }
                if(count==0 && i!=0)
                        i=0;
                *(real+k)=*(result+i);
                i++;
                k++;
                count++;
                j=0;
        }
        printf("%s\n",real);
        fclose(file);
        free(result);
        free(real);
        return 0;
}

论坛徽章:
0
3 [报告]
发表于 2006-06-19 01:39 |只看该作者
我倒,不就是个数据库嘛。

论坛徽章:
0
4 [报告]
发表于 2006-06-19 08:52 |只看该作者
做个hash
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP