HDU4287 Intelligent IME
★
我们用手机输入时,每个数字都对应几个字母,对应关系为:
2 : a, b, c 3: d, e, f 4 : g, h, i 5 : j, k, l 6 : m, n, o
7 : p, q, r, s 8 : t, u, v 9 : w, x, y, z
输入:第一行为T,表输入的实例个数。对于每个实例,第一行为N (1 <= N <= 5000)与M (1 <= M <= 5000)。接下来N行每行是一些连续的数字,如467,表示按了键盘的4键,6键,7键。接下来M行每行是一个由小写字母组成的单词。单词与数字都不会重复,且单词和数字的长度最多为6.
输出:输出这N个数字每个数字对应几个单词。
分析:可以用一个MAP<char,int> MP来表示如MP[a]=2,MP[b]=2,MP[c]=2,MP[d]=3等。每个单词中的每个字母的键值(数字)组合成一个数能对应给出的数就行。
AC代码:
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
map<char ,int> mp;
int num[1000000+100];//num[i]=j表输入的N个数中有一个是i,且这个i数对应了j个单词(计数)
int n_num[5000+100];//n_num[j]=i表输入的N个数中第j个输入的数是i
char m_str[5000+100][10];//m_str[i]="abc"表输入的M个单词中第i个单词是“abc”
int main()
{
mp.clear();
mp['a']=2;
mp['b']=2;
mp['c']=2;
mp['d']=3;
mp['e']=3;
mp['f']=3;
mp['g']=4;
mp['h']=4;
mp['i']=4;
mp['j']=5;
mp['k']=5;
mp['l']=5;
mp['m']=6;
mp['n']=6;
mp['o']=6;
mp['p']=7;
mp['q']=7;
mp['r']=7;
mp['s']=7;
mp['t']=8;
mp['u']=8;
mp['v']=8;
mp['w']=9;
mp['x']=9;
mp['y']=9;
mp['z']=9;
int t;
while(scanf("%d",&t)==1&&t)
{
while(t--)
{
memset(num,0,sizeof(num));//初始化所有数字的次数
intn,m;
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++)
scanf("%d",&n_num[i]);//存每个数字
for(int i=0; i<m; i++)
{
scanf(" %s",m_str[i]);//读每个单词
int len=strlen(m_str[i]);
int value=0;
for(int j=0; j<len; j++)//将每个单词转化为对应的值
{
value = value*10+mp[m_str[i][j]];
}
num[value]++;//该值计数加一
}
for(int i=0; i<n; i++)
printf("%d\n",num[n_num[i]]);
}
}
return 0;
}