原题链接:
hdu: http://acm.hdu.edu.cn/showproblem.php?pid=4287
sdnu: http://210.44.14.31/problem/show/1119
别人实在是太巧妙了,自己写的差太多了。
逆向思考.
数字串可以对应多个字母串。
但是 一个字母串只对应一个数字串。
利用map写,更是轻松。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
using namespace std;
const int MAXN=5000+10;
char num[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'};
string numstring[MAXN];
map<string,int>number;
int main()
{
int T;
char ch[10];
scanf("%d",&T);
while(T--)
{
int N,M;
number.clear();
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)
{
scanf("%s",ch); //也可直接用string,但慢一点。测试过。
numstring[i]=string(ch); //记录下输入的数字串,记录输入顺序,方便下文输出
number.insert(make_pair(string(ch),0));//放入map
}
for(int i=0;i<M;i++)
{
scanf("%s",ch);
for(int j=0;j<strlen(ch);j++)
ch[j]=num[ch[j]-'a'];
if(number.find(string(ch))!=number.end()) //判断对应的数字串是否存在。(也可不写该句,不写又不找不到时会在number.end()->second++)
(number.find(string(ch)))->second++;//对应的数字串+1
}
for(int i=0;i<N;i++)
printf("%d\n",number.find(numstring[i])->second);
}
return 0;
}