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