哈希法求解百度语言翻译机

21 篇文章 0 订阅
1 篇文章 0 订阅

题目来源: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 个字符)

输出数据:

输出将缩率语转换成日常语言的文档。(将缩率语转换成日常语言,其他字符保留原样)

输入样例



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;
}


代码粘贴完毕,求挑错,求打脸 !

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值