题意:
给定每个数字对应的几个字母,然后计算输入每串数字,可能输出几种对应的字母?
这题一开始我把字母加入到字典树里了,然后dfs枚举数字可能对应的字母,然后查询~
后来想了一下,发现把数字加入到字典树复杂度降低很多,然后用一个一维数组把每个字母对应的数字存起来。进行查询即可。。
#include <stdio.h>
#include <string.h>
int f[1000]={2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};
struct Trie
{
Trie *ch[10];
bool flag;
int sz;
};
Trie *H;
int idx(char c)
{
return c - '0';
}
Trie *newnode()
{
Trie *p = new Trie;
for(int i = 0; i < 10; i++)
{
p->ch[i] = NULL;
}
p->flag = false;
p->sz = 0;
return p;
}
void insert(char *ss)
{
int len = strlen(ss);
Trie *p = H;
for(int i = 0; i < len; i++)
{
int c = idx(ss[i]);
if(p->ch[c] == NULL)
{
p->ch[c] = newnode();
}
p = p->ch[c];
}
p->flag = true;
}
int query(char *ss, int x)
{
Trie *p = H;
int len = strlen(ss);
for(int i = 0; i < len; i++)
{
int c = idx(ss[i]);
p = p->ch[c];
if(p == NULL)
{
return 0;
}
}
if(x && p->flag)
{
p->sz++;
}
return p->sz;
}
int main()
{
char c[10], a[5000][10];
int T, N, M;
scanf("%d", &T);
while(T--)
{
H = newnode();
scanf("%d %d", &N, &M);
for(int i = 0; i < N; i++)
{
scanf("%s", a[i]);
insert(a[i]);
}
for(int i = 0; i < M; i++)
{
scanf("%s", c);
int len = strlen(c);
for(int j = 0; j < len; j++)
{
c[j] = f[c[j]-'a']+'0';
}
//printf("query%s\n", c);
query(c, 1);
}
for(int i = 0; i < N; i++)
{
printf("%d\n",query(a[i], 0));
}
}
return 0;
}