题目:http://acm.hdu.edu.cn/showproblem.php?pid=1247
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 char p[50005][30]; 8 struct tree{ //建立树 9 struct tree *next[26]; 10 int n; 11 }*root;//根 12 13 void insert(char *p)//字典树添加 14 { 15 struct tree *now,*cur=root; 16 int len=strlen(p); 17 for(int i=0;i next[p[i]-'a']==NULL)//判断字母节点是否存在 20 { 21 now=(struct tree*)malloc(sizeof(struct tree));//分配空间 22 for(int j=0;j<26;j++) 23 { 24 now->next[j]=NULL;//初始化 25 } 26 now->n=0;//初始化 27 cur->next[p[i]-'a']=now; 28 cur=cur->next[p[i]-'a']; 29 } 30 else 31 { 32 cur=cur->next[p[i]-'a']; 33 } 34 } 35 cur->n=1;//字母存在并标记为1 36 } 37 38 int find2(char *p)//查找后缀树 39 { 40 struct tree *cur=root; 41 for(;*p!='\0';) 42 { 43 int d=*p-'a'; 44 if(cur->next[d]!=NULL) 45 { 46 cur=cur->next[d]; 47 if(cur->n==1 && *(p+1)=='\0')//判断条件 48 return 1; 49 p++; 50 } 51 else 52 { 53 return 0; 54 } 55 } 56 return 0; 57 } 58 59 int find(char *p)//查找 60 { 61 struct tree *cur=root; 62 for(;*p!='\0';) 63 { 64 int d=*p-'a'; 65 cur=cur->next[d]; 66 if(cur!=NULL) 67 { 68 if(cur->n==1 && find2(p+1))//查找前缀字母是否存在,同时判断后缀树 69 return 1; 70 p++; 71 } 72 else 73 { 74 return 0; 75 } 76 } 77 return 0; 78 } 79 80 int main() 81 { 82 //freopen("in.txt","r",stdin); 83 int i=0; 84 root=(struct tree*)malloc(sizeof(struct tree));//初始化 85 for(i=0;i<26;i++) 86 { 87 root->next[i]=NULL; 88 } 89 root->n=0; 90 i=0; 91 while(scanf("%s",p[i])!=EOF) 92 { 93 insert(p[i]); 94 i++; 95 } 96 for(int j=0;j