头次接触字典树(可当模板用),解题思路来自
#include<bits/stdc++.h>//字典树动态模板 using namespace std; const int maxn=26; struct trie { trie *next[maxn]; int v; }*a;//a为根节点,不存信息,是字典树的入口 void init()//初始化 { a=new trie; for(int i=0; i<maxn; i++) a->next[i]=NULL; } void trie_insert(char *s) { int n=strlen(s); trie *p=a;//每次从根节点a开始查询 p->v++; for(int i=0;i<n;i++) { int id=s[i]-'a';//对应字母和下标匹配 if(p->next[id]==NULL)//字母不存在 { p->next[id]=new trie; p=p->next[id];//和下一句顺序不能反 p->v=1; for(int j=0;j<maxn;j++) p->next[j]=NULL; } else { p->next[id]->v++; p=p->next[id]; } } } int trie_search(char *s) { int n=strlen(s); trie *p=a; for(int i=0;i<n;i++) { int id=s[i]-'a'; if(p->next[id]==NULL)//无查询结果 return 0; else p=p->next[id]; } return p->v;//前缀出现次数 } void trie_delete(trie *root)//避免内存泄露 { if(root==NULL) return; else { for(int i=0;i<maxn;i++) trie_delete(root->next[i]); } delete (root); } int main() { init(); char s[100]; while(gets(s)) { if(strcmp(s,"")==0) break; trie_insert(s); } while(scanf("%s",s)==1) printf("%d\n",trie_search(s)); trie *root=a; trie_delete(root); return 0; }