然后还翻看了之前AC的,一看,原来之前是用别人的模板来AC的,好无耻啊,这把是自己写的。
1 /* 2 自己来写字典树 3 */ 4 #include <stdio.h> 5 #include <malloc.h> 6 #include <string.h> 7 struct node 8 { 9 int size; //该结点上的前缀单词的个数 10 struct node *child[26]; //下一个单词的结点 11 }a; 12 typedef struct node NODE; 13 NODE *root; //表示根节点。(根节点里面什么也不包含) 14 void insert(char word[]) 15 { 16 int l=strlen(word); 17 int i,j; 18 int temp; 19 NODE *s=root; 20 for(i=0;i<l;++i) 21 { 22 temp=word[i]-'a'; 23 if(s->child[temp]==NULL) //如果未出现,则建立一个。 24 { 25 NODE *t=(NODE *)malloc(sizeof(a)); 26 s->child[temp]=t; 27 t->size=1; 28 for(j=0;j<26;++j) 29 { 30 t->child[j]=NULL; 31 } 32 s=t; //更换结点 33 } 34 else //如果出现了,则 35 { 36 s=s->child[temp]; 37 s->size++; 38 } 39 } 40 return ; 41 } 42 void init(NODE *tem) //重定义字典树 43 { 44 int i; 45 for(i=0;i<26;++i) 46 { 47 if(tem->child[i]!=NULL) //如果子节点不为空 48 { 49 init(tem->child[i]); 50 free(tem->child[i]); 51 } 52 } 53 return ; 54 } 55 int check(char word[]) //字符串的查找 56 { 57 int l=strlen(word); //计算字符串的长度 58 int i; 59 int temp; 60 int res; 61 NODE *p=root; 62 for(i=0;i<l;++i) 63 { 64 temp=word[i]-'a'; 65 if(p->child[temp]!=NULL) 66 { 67 p=p->child[temp]; 68 res=p->size; 69 } 70 else 71 { 72 return 0; 73 } 74 } 75 return res; 76 } 77 int main() 78 { 79 char temp[15]; 80 int res; 81 int i; 82 root=(NODE *)malloc(sizeof(a)); 83 for(i=0;i<26;++i) 84 { 85 root->child[i]=NULL; 86 } 87 while(gets(temp),strcmp(temp,"")) 88 { 89 insert(temp); 90 } 91 while(~scanf("%s",temp)) 92 { 93 res=check(temp); 94 printf("%d\n",res); 95 } 96 return 0; 97 }