hdu4287 字典树
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 10 struct trie { trie *next[10]; int sum; int flag; }; trie *root; char way[5010][10]; void init() { root=(trie*)malloc(sizeof(trie)); for(int i=2;i<10;i++) root->next[i]=NULL; root->flag=0; root->sum=0; } int check(char c) { if(c>='a'&&c<='c') return 2; if(c>='d'&&c<='f') return 3; if(c>='g'&&c<='i') return 4; if(c>='j'&&c<='l') return 5; if(c>='m'&&c<='o') return 6; if(c>='p'&&c<='s') return 7; if(c>='t'&&c<='v') return 8; return 9; } void insert(char *s) { int i,j,len=strlen(s); trie *p=root,*q; for(i=0;i<len;i++) { int id=check(s[i]); if(p->next[id]==NULL) { q=(trie*)malloc(sizeof(trie)); for(j=2;j<10;j++) q->next[j]=NULL; q->flag=q->sum=0; p->next[id]=q; } p=p->next[id]; p->sum++; if(i==len-1) p->flag++; } } int find(char *s) { trie *p=root; int i,j,len=strlen(s); for(i=0;i<len;i++) { int id=s[i]-'0'; if(p->next[id]==NULL) return 0; p=p->next[id]; } return p->flag; } void freetrie(trie *root) { int i,j; for(i=2;i<10;i++) { if(root->next[i]!=NULL) freetrie(root->next[i]); } free(root); } int main() { int i,j,t,n,m; char s[maxn]; scanf("%d",&t); while(t--) { init(); scanf("%d %d",&n,&m); for(i=0;i<n;i++) scanf("%s",way[i]); for(i=0;i<m;i++) { scanf("%s",s); insert(s); } for(i=0;i<n;i++) { printf("%d\n",find(way[i])); } freetrie(root); } }