题意:从1到9,每个数字分别代表多个不同的字母。
给出N个数字,M个字符串,将N个数字转化为字母之后求出其在M个字符串中出现了多少次。
思路:该题与USACO上第一章有个题类似,如果将数字转化为字母太复杂不好处理。反向思考,将M个字符串转化为对应的数字,然后每次只需要与M个数字比较即可。
#include<cstdio>
#include<cstring>
int f[1000001];
int map[26]={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};
int main()
{
int T,n,m,i,j,ans,a[5001];
char s[10];
scanf("%d",&T);
while(T--)
{
memset(f,0,sizeof(f));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=m;i++)
{
scanf("%s",s);
j=0;
ans=0;
while(s[j]!='\0')
{
ans*=10;
ans+=map[s[j]-'a'];
j++;
}
//printf("%d\n",ans);
f[ans]++;
}
for(i=1;i<=n;i++)
printf("%d\n",f[a[i]]);
}
return 0;
}