1 3 5 46 64448 74 go in night might gn
3 2 0
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAX = 10 ; const int maxn = 5005 ; struct trie{ int first; trie *next[MAX]; }; trie *root; int T,N,M; char str[7],ss; int ans[maxn],slen; void createTrie(char *s,int n){ trie *p=root,*q; int len=strlen(s),pos; for(int i=0;i<len;i++){ pos=s[i]-'0'; if(p->next[pos]==NULL){ q=new trie; q->first=0; for(int j=0;j<MAX;j++) q->next[j]=NULL; p->next[pos]=q; p=p->next[pos]; } else{ p=p->next[pos]; } } p->first=n; } int findTrie(char *s){ trie *p=root; int len=strlen(s),pos; for(int i=0;i<len;i++){ pos=s[i]-'0'; if(p->next[pos]==NULL) return 0; p=p->next[pos]; } return p->first; } void delTrie(trie *Root){ for(int i=0;i<MAX;i++){ if(Root->next[i]!=NULL) delTrie(Root->next[i]); } free(Root); } char getLetter(char s){ if(s>='a'&&s<='c') return '2'; else if(s>='d'&&s<='f') return '3'; else if(s>='g'&&s<='i') return '4'; else if(s>='j'&&s<='l') return '5'; else if(s>='m'&&s<='o') return '6'; else if(s>='p'&&s<='s') return '7'; else if(s>='t'&&s<='v') return '8'; else return '9'; } int main(){ scanf("%d",&T); while(T--){ root=new trie; for(int i=0;i<MAX;i++) root->next[i]=NULL; memset(ans,0,sizeof(ans)); memset(str,'\0',sizeof(str)); scanf("%d%d",&N,&M); for(int i=1;i<=N;i++){ scanf("%s",str); createTrie(str,i); } for(int i=0;i<M;i++){ scanf("%s",str); slen=strlen(str); for(int j=0;j<slen;j++){ ss=str[j]; str[j]=getLetter(ss); } int an=findTrie(str); if(an) ans[an]++; } for(int i=1;i<=N;i++) printf("%d\n",ans[i]); delTrie(root); } return 0; }
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAX = 28; const int maxn = 5005; char str[10][4]={{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'}, {'m','n','o'},{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}}; int ank[8]={3,3,3,3,3,4,3,4}; struct trie{ bool point; trie *next[MAX]; }; struct edge{ int n; int x[6]; }num[maxn]; trie *root; char s[7]; int T,N,M,slen,nn,sum; int vis[10][7]; void createTrie(char *s){ trie *p=root,*q; int len=strlen(s),pos; for(int i=0;i<len;i++){ pos=s[i]-'a'; if(p->next[pos]==NULL){ q=new trie; q->point=false; for(int j=0;j<MAX;j++) q->next[j]=NULL; p->next[pos]=q; p=p->next[pos]; } else{ p=p->next[pos]; } } p->point=true; } bool findTrie(char *s){ trie *p=root; int len=strlen(s),pos; for(int i=0;i<len;i++){ pos=s[i]-'a'; if(p->next[pos]==NULL) return false; p=p->next[pos]; } return p->point; } void delTrie(trie *Root){ for(int i=0;i<MAX;i++){ if(Root->next[i]!=NULL) delTrie(Root->next[i]); } free(Root); } void findAns(int a[],int k,int n,char *s){ if(k==n){ //printf("%s ",s); if(findTrie(s)){ sum++; }return ; } int kk=a[k]-2; for(int i=0;i<ank[kk];i++){ if(!vis[k][i]){ s[k]=str[kk][i]; vis[k][i]=1;k++; findAns(a,k,n,s); k--;vis[k][i]=0; } }return ; } int main(){ scanf("%d",&T); while(T--){ nn=0; root=new trie; for(int i=0;i<MAX;i++) root->next[i]=NULL; scanf("%d%d",&N,&M); for(int i=0;i<N;i++){ scanf("%s",s); slen=strlen(s); for(int j=0;j<slen;j++) num[nn].x[j]=s[j]-'0'; num[nn].n=slen; nn++; } for(int i=0;i<M;i++){ scanf("%s",s); createTrie(s); } for(int i=0;i<nn;i++){ sum=0; memset(s,'\0',sizeof(s)); memset(vis,0,sizeof(vis)); //for(int j=0;j<num[i].n;j++) cout<<num[i].x[j]<<" "; findAns(num[i].x,0,num[i].n,s); printf("%d\n",sum); } delTrie(root); }return 0; }
原文:http://blog.csdn.net/jhgkjhg_ugtdk77/article/details/44661275