字典树不会的同学:点这里
题意: 手机上有如下映射
2 -> a,b,c
...
9-> w x y z
给你n个数字 和 m个单词 ,问每个数字对应的映射能组成多少种单词.依次输出.
一开始做的时候脑子进水了 ,把字母存入字典树里,结果就要考虑数字对应的字母情况.
比如 23对应 ad ae af bd be bf cd ce cf.这样内存不够.
我们把数字存入字典树,定义一个数组完成字母到数字的映射:
<span style="font-size:18px;">#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char word[5005][10];
int ans[5005];
int sign[129];
typedef struct ac{
int num; //记录是第几个数
struct ac *child[10];
}tree;
tree* root;
void init(){ //初始化
sign['a']=sign['b']=sign['c']=2;
sign['d']=sign['e']=sign['f']=3;
sign['g']=sign['h']=sign['i']=4;
sign['j']=sign['k']=sign['l']=5;
sign['m']=sign['n']=sign['o']=6;
sign['p']=sign['q']=sign['r']=sign['s']=7;
sign['t']=sign['u']=sign['v']=8;
sign['w']=sign['x']=sign['y']=sign['z']=9;
}
void clear(tree * p) { //清缓存
if(p==NULL) return ;
else for(int i=0;i<=9;i++) clear(p->child[i]);
free(p);
}
void add(char *p,int i){ //添加
int l=strlen(p);
tree *a=root,*b;
for(int i=0;i<l;i++){
int k=p[i]-'0';
if(a->child[k]!=0) a=a->child[k];
else{
b=(tree *)malloc(sizeof(tree));
for(int j=0;j<=9;j++) b->child[j]=NULL;
a->child[k]=b;
a=b;
}
}
a->num=i;
}
void search_word(char *p){ //查找
int l=strlen(p);
tree *a=root;
for(int i=0;i<l;++i){
int k=sign[p[i]];
if(a->child[k]==NULL) return ;
else a=a->child[k];
}
ans[a->num]++;
}
void init_root(){ //初始化root
root=(tree *)malloc(sizeof(tree));
for(int i=0;i<=9;i++) root->child[i]=NULL;
memset(ans,0,sizeof(ans));
clear(root);
}
int main()
{
init();
int T,n,m,x;
scanf("%d",&T);
while(T--){
init_root();
scanf("%d %d",&n,&m);
char s[10];
for(int i=1;i<=n;++i){
scanf("%s",&s);
add(s,i);
}
for(int i=1;i<=m;++i){
scanf("%s",s);
search_word(s);
}
for(int i=1;i<=n;++i) printf("%d\n",ans[i]);
}
return 0;
}
/*
Sample Input
1
3 5
64448
46
74
go
in
night
might
gn
Sample Output
3
2
0
Source
*/
</span>