分析:字典树解决,注意节点里面只需要保存该点是否构成一个单词,和匹配类型的题有所区别;另外要注意重读打印。字典树效率高。
#include<iostream> using namespace std; struct Tri { bool v; Tri* child[26]; }; Tri* root; void Init() { root->v=false; for(int i=0;i<26;i++) { root->child[i]=NULL; } } void CreateDic(char* str) { Tri* p; int j; p=root; while(*str!=NULL) { if(p->child[*str-'a']==NULL) { p->child[*str-'a']=(Tri*)new Tri; p->child[*str-'a']->v=false; for(j=0;j<26;j++) p->child[*str-'a']->child[j]=NULL; } p=p->child[*str-'a']; str++; } p->v=true; } bool Find(char* str) { Tri* p=root; while(*str!=NULL) { if(p->child[*str-'a']==NULL) return 0; p=p->child[*str-'a']; str++; } return p->v; } void Del(Tri* p) { for(int i=0;i<26;i++) if(p->child[i]) Del(p->child[i]); Del(p); } char total[50002][100]; int main() { char a[100],b[100],c[100]; int i=0,j,k; root=(Tri*)new Tri; Init(); while(gets(a)) { CreateDic(a); strcpy(total[i++],a); } for(j=0;j<i;j++) { for(k=1;k<strlen(total[j]);k++) { strncpy(b,total[j],k); b[k]='\0'; strcpy(c,total[j]+k); if(Find(b)&&Find(c)) { cout<<total[j]<<endl; break; //注意查找成功后,一定要跳出循环,否则会重复输出 } } } return 0; }
HDU ACM 1247-Hat’s Words-字典树(Trie)
原文地址:http://blog.csdn.net/a809146548/article/details/45157539