hdu1075Phone List(字典树)

来源:互联网 发布:日本围棋软件 编辑:程序博客网 时间:2024/05/29 17:29

1.题目链接:

   http://acm.hdu.edu.cn/showproblem.php?pid=1075

 

2.题意:根据所提供的“字典”,解破火星文。

 

3.参考代码一:

 

#include <stdio.h>#include <string.h>#include <ctype.h>char s1[3000],s2[3000];struct node{char s[14];node* next[26];bool flag;   ///标记是否在字典树里node(){memset(s,0,sizeof(s));memset(next,0,sizeof(next));flag=0;}};node* root=NULL;void build(node* t,int id){   ///建立if(!t->next[s2[id]-'a'])t->next[s2[id]-'a']=new node;if(s2[id+1])build(t->next[s2[id]-'a'],id+1);else   ///若找到则替换{strcpy(t->next[s2[id]-'a']->s,s1);t->next[s2[id]-'a']->flag=1;}} int find(node* t,int id){   ///查找if(!t->next[s2[id]-'a'])return 0;if(s2[id+1]=='\0'){if(t->next[s2[id]-'a']->flag){printf("%s",t->next[s2[id]-'a']);return 1;}return 0;}return find(t->next[s2[id]-'a'],id+1);}int main(){root=new node;int i,j;scanf("START%*c");while(scanf("%s%*c",s1) && strcmp(s1,"END")){scanf("%s%*c",s2);build(root,0);}scanf("START%*c");while(gets(s1) && strcmp(s1,"END"))   ///句子记得用gets()接收{for(i=0;s1[i];i++){if(!islower(s1[i]))   ///若不是小写字母putchar(s1[i]);   ///则直接输出else{j=0;while(islower(s1[i]))s2[j++]=s1[i++];s2[j]='\0';   ///别忘了赋'\0'i--;   ///防止读取非法内存(eg.假如说s1的长度是10,s[0]~s[9]存的是字符,s[10]是'\0',如果不i--下一层循环就会出错,所以要可特别注意!!!)if(!find(root,0))   ///找不到则原样输出printf("%s",s2);j=0;}}printf("\n");}return 0;}


 

 

参考代码二:

 

 

#include <iostream>#include <string>#include <map>using namespace std;map<string,string>M;int main(){string a,b;cin>>a;while(cin>>a && a!="END"){cin>>b;M[b]=a;}cin>>a;getchar();char tmp[5000];while(1){gets(tmp);if(!strcmp(tmp,"END"))break;int i,len=strlen(tmp);b="";for(i=0;i<len;i++){if(!(tmp[i]>='a' && tmp[i]<='z')){if(M[b]!="")cout<<M[b];elsecout<<b;b="";cout<<tmp[i];}elseb+=tmp[i];}cout<<endl;}return 0;}