题目来源:http://www.programfan.com/acm/show.asp?qid=112#comment
百度语言翻译机
2006 年百度之星程序设计大赛初赛题目 6
百度语言翻译机
时限 1s
百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套他们独特的缩率语。他们在平时的交谈,会议,甚至在各中技术文档中都会大量运用。
为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决定开发一套专用的翻译系统,把相关文档中的缩率语和专有名词翻译成日常语言。
输入数据:
输入数据包含三部分
1. 第一行包含一个整数 N ( N<=10000 ),表示总共有多少个缩率语的词条。
2. 紧接着有 N 行的输入,每行包含两个字符串,以空格隔开。第一个字符串为缩率语(仅包含大写英文字符,长度不超过 10 ),第二个字符串为日常语言(不包含空格,长度不超过 255 ) .
3. 从第 N+2 开始到输入结束为包含缩略语的相关文档。(总长度不超过 1000000 个字符)
输出数据:
输出将缩率语转换成日常语言的文档。(将缩率语转换成日常语言,其他字符保留原样)
输入样例
百度语言翻译机
时限 1s
百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套他们独特的缩率语。他们在平时的交谈,会议,甚至在各中技术文档中都会大量运用。
为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决定开发一套专用的翻译系统,把相关文档中的缩率语和专有名词翻译成日常语言。
输入数据:
输入数据包含三部分
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 小组。
输出样例
百度的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等,其中门户搜索部还包括自然语言处理小组。
解题思路:将汉语字符串和英语字符串存储子以英文字母开头的表结构中,搜索字符串,并替代之,在插入表时,哈希到同一个位置的话,就放在下一个位置 ;
数据组织的数据结构是:
typedef struct trans
{
char eng[10];
char cha[20];
trans *next;
}trans;
typedef struct
{
char vex;//每一个表元素的标号“H” “j” 等
trans *link;//链接域 ,后面连接的是trans类型的 struct
}hash;
代码如下:
#include<iostream>
#include<stdlib.h>
#include<fstream>
#include<string>
using namespace std;
typedef struct trans
{
char eng[10];
char cha[20];
trans *next;
}trans;
typedef struct
{
char vex;
trans *link;
}hash;
hash table[10];
char orig[100]; //如果申请空间少 会影响到别的变量值
void init()
{
int n ;
ifstream in("a.txt");
in>>n;
char a[10],b[20];
trans *temp=NULL;
for(int i=0;i<n;i++)
{
table[i].link=NULL;
}
for( i=0;i<n;i++)
{
in>>a;
in>>b;
int key=(a[0]-'A')%n;
temp=new trans;
/* if(table[key].vex==NULL)
{
table[key].vex=a[0];
strcpy(temp->eng,a);
strcpy(temp->cha,b);
temp->next=table[key].link;
table[key].link=temp;
}
if(table[key].vex!=NULL&&a[0]==table[key].vex)
{
strcpy(temp->eng,a);
strcpy(temp->cha,b);
temp->next=table[key].link;
table[key].link=temp;
}
else if(table[key].vex!=NULL&&a[0]!=table[key].vex) //哈希到同一个位置 但是 首字母不同 往后移直至有空位放下
{
while(table[key].vex!=NULL)
{
key++;
}
table[key].vex=a[0];
strcpy(temp->eng,a);
strcpy(temp->cha,b);
temp->next=table[key].link;
table[key].link=temp;
}
*/
if(table[key].vex==NULL)
{
table[key].vex=a[0];
}
if(table[key].vex!=NULL&&a[0]==table[key].vex)
{
}
else if(table[key].vex!=NULL&&a[0]!=table[key].vex) //哈希到同一个位置 但是 首字母不同 往后移直至有空位放下
{
while(table[key].vex!=NULL)
{
key++;
}
table[key].vex=a[0];
}
strcpy(temp->eng,a);
strcpy(temp->cha,b);
temp->next=table[key].link;
table[key].link=temp;
}
int cnt=0;
char ch;
while((in>>ch)!=NULL)
{
// cout<<orig[cnt];
cout<<ch;
orig[cnt++]=ch; //输入带有逗号的语句
}
cout<<endl;
cout<<"翻译结果如下: "<<endl;
}
///字符串对比
//求字符串的长度 1.char* a[]="fsdfsd" ,写成数组形式 2 strlen()函数
bool cmp(char *a,char *b)
{
int lenb=strlen(b); //只求模式的长度 就可以了
for(int i=0;i<lenb;i++ )
{
if(*(a+i)!=*(b+i))
{
return false;
}
}
return true;
}
void find(char a[],int &cnt)//在表中为一个单词找到对应中文
{
int key=(a[0]-'A')%6;
while(table[key].vex!=a[0]) //如果是哈希到同一个位置的 重叠字符
{
key++; //将索引值向后直到找到 对应的link位置
}
trans *temp=table[key].link ;
while(temp!=NULL)
{
if(cmp(a,temp->eng))
{
cout<<temp->cha;
cnt=0; // //将现有的temp里的字段进行翻译
return ;
}
else temp=temp->next;
}
}
void translate()
{
int i=0;
char result[30];
char temp[5];
int cnt=0;
while(orig[i]!=NULL) //逐字的进行翻译
{
if(orig[i]>'A'&&orig[i]<'Z') //是否为大写字母
{
temp[cnt++]=orig[i];
}
else //不是字母是汉字 或符号
{
if(cnt>0)find(temp, cnt);
// 直接输出
cout<<orig[i];
}
i++;
}
}
int main(int argc, char* argv[])
{
init();
translate();
system("PAUSE");
return 0;
}
代码粘贴完毕,求挑错,求打脸 !