hdu1075(字典树)
http://acm.hdu.edu.cn/showproblem.php?pid=1075
思路:这是字典树水题,只要对插入字典书中的单词标号,然后再根据标号的单词去找相对应的单词就好..............最需要注意的是,hello插入字典树后,如果查找hell应该是返回0的。这里需要对单词末尾进行标记.................
#include<iostream> #include<string.h> using namespace std; typedef struct tree { int num; int flag; tree *next[26]; }tree; tree *root; char s[1000000][15]; void creat(char str[],int tmp) { int len=strlen(str); tree *p=root,*q; for(int i=0;i<len;i++) { int x=str[i]-'a'; if(!p->next[x]) { q=(tree *)malloc(sizeof(tree)); q->num=tmp; q->flag=0; for(int j=0;j<26;j++) q->next[j]=NULL; p->next[x]=q; p=q; } else if(p->next[x]->flag==0) { p->next[x]->num=tmp; p=p->next[x]; } } p->flag=1; //标记单词末尾 } int find(char str[]) { int len=strlen(str); tree *p=root; for(int i=0;i<len;i++) { int x=str[i]-'a'; if(p->next[x]) p=p->next[x]; else return 0; } if(p->flag) //如果是单词末尾,则返回对应值,否则返回0 return p->num; else return 0; } void del(tree *root) { for(int i=0;i<26;i++) if(root->next[i]) del(root->next[i]); free(root); } int main() { root=(tree *)malloc(sizeof(tree)); for(int i=0;i<26;i++) root->next[i]=NULL; root->flag=0; root->num=0; char t[4000],f[20],b[4000]; int j=1; scanf("%s",s[j]); while(1) { scanf("%s",s[j]); if(s[j][0]=='E') break; j++; scanf("%s",s[j]); creat(s[j],j); j++; } getchar(); gets(b); while(1) { gets(t); if(t[0]=='E') break; int len=strlen(t); j=0; for(i=0;i<len;i++) { if(t[i]>=97&&t[i]<=122) { f[j++]=t[i]; } else { f[j]='\0'; if(find(f)) { int num=find(f); printf("%s",s[num-1]); } else { printf("%s",f); } printf("%c",t[i]); memset(f,0,sizeof(f)); //清空数组 j=0; } } printf("\n"); } del(root); return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。