hdu 1247 Hat’s Words(Trie树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1247
View Code
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 char str[50010][105]; 6 struct node 7 { 8 int flag; 9 node *next[26]; 10 }; 11 node *build() 12 { 13 int i; 14 node *p; 15 p=new node; 16 p->flag=0; 17 for(i=0;i<26;i++) 18 p->next[i]=NULL; 19 return p; 20 } 21 void insert(node *p,char *s) 22 { 23 int len,i,t; 24 len=strlen(s); 25 for(i=0;i<len;i++) 26 { 27 t=s[i]-'a'; 28 if(p->next[t]==NULL) 29 p->next[t]=build(); 30 p=p->next[t]; 31 } 32 p->flag=1; 33 } 34 int sear(node *p,char *s) //这样写就wa了,不明白为什么。。。 35 { //{ 36 int t; // int t; 37 while(*s!='\0') // while(*s!='\0') 38 { // { 39 t=*s-'a'; // t=*s-'a'; 40 if(p->next[t]==NULL) // if(p->next[t]=NULL) 41 return 0; // return 0; 42 p=p->next[t]; // p=p->next[t]; 43 if(p->flag==1&&*(s+1)=='\0') // s++; 44 return 1; // } 45 s++; // if(p->flag==1) 46 } // return 1; 47 return 0; // return 0; 48 } //} 49 int search(node *p,char *s) 50 { 51 int len,i,t; 52 node *h; 53 h=p; 54 len=strlen(s); 55 for(i=0;i<len;i++) 56 { 57 t=s[i]-'a'; 58 if(h->next[t]==NULL) 59 return 0; 60 h=h->next[t]; 61 if(h->flag==1&&sear(p,s+i+1)) 62 return 1; 63 } 64 return 0; 65 } 66 int main() 67 { 68 int i=0,j; 69 node *p; 70 p=build(); 71 while(gets(str[i])!=NULL) 72 { 73 insert(p,str[i]); 74 i++; 75 } 76 for(j=0;j<i;j++) 77 { 78 if(search(p,str[j])) 79 puts(str[j]); 80 } 81 return 0; 82 }