以前也看过字典树。当初貌似懂了,结果忘了,所以又打算重新学学。 网上找了些代码,大都是用指针实现的,本人看到指针就头大。 郁闷啊。 所以,自己写了个没用指针实现的。 #include <iostream> using namespace std; struct node{ int cnt;//前缀出现次数 int acnt;//单词出现次数 bool ans;//是否是单词 int flag[26];//是否出现字母 }tree[1000000]; int cnt=1; void insert(char *ch) { int len=strlen(ch),i,num,pos; for(i=0,num=1;i<len;++i) { pos=ch[i]-'a'; if(tree[num].flag[pos]==0) tree[num].flag[pos]=++cnt; num=tree[num].flag[pos]; tree[num].cnt++; } tree[num].ans=1; tree[num].acnt++; } int query(char *ch) { int len=strlen(ch),i,num,pos; for(i=0,num=1;i<len;++i) { pos=ch[i]-'a'; if(tree[num].flag[pos]==0) return 0; num=tree[num].flag[pos]; } return tree[num].cnt; } int main() { char ch[20]; while(gets(ch)) { int len=strlen(ch); if(len==0) break; insert(ch); } while(gets(ch)) printf("%d/n",query(ch)); return 0; }