HDU 4287 Intelligent IME 水题
主要其他博客写的太麻烦,所以决定写一写这个题的题解:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4287
题意:
第一行:T:几组测试样例
第二行:n,m
接下来n行每行一个数字
接下来m行每行一个字符串(长度不超过6)
要求:
按照手机九宫格字母和数字的对应规则:
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
询问对于给定的m个字符串,有多少是可以通过这n个数字串里的数字顺序按下可以得到的。
比如:数字串64:mg ,mh ,mi, ng……..等组合
思路:见代码注释比较详细了
///由于每一个字符串都会对应一些数字,所以计算字符串对应的数字a,并利用mark[a]来记录个数
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int Z='z'+5;
const int maxn =1e7+10;
const int mm=1e4+10;
int a[mm];///记录输入的n个数字
int dig[Z];///dig[c]代表字母c所对应的数字是什么
int mark[maxn];///用于记录数字i出现了多少次
int main()
{
dig['a']=2;dig['b']=2;dig['c']=2;
dig['d']=3;dig['e']=3;dig['f']=3;
dig['g']=4;dig['h']=4;dig['i']=4;
dig['j']=5;dig['k']=5;dig['l']=5;
dig['m']=6;dig['n']=6;dig['o']=6;
dig['p']=7;dig['q']=7;dig['r']=7;dig['s']=7;
dig['t']=8;dig['u']=8;dig['v']=8;
dig['w']=9;dig['x']=9;dig['y']=9;dig['z']=9;
int T,N,M;
scanf("%d",&T);char ss[10];
while(T--){
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)
{
scanf("%d",&a[i]);///读入数字
mark[a[i]]=0;///初始化这些数字的个数值为0
}
for(int i=0;i<M;i++)
{
scanf("%s",ss);
int tmp=0;
for(int i=0;ss[i]!='\0';i++)///将字符串转化为数字存储
{
tmp*=10;///举例:adg=((a对应的数字键*10+d对应的数字键)*10+g对应的数字键)*10
tmp+=dig[ss[i]];
}
mark[tmp]++;
// cout<<tmp<<endl;
}
for(int i=0;i<N;i++)
{
printf("%d\n",mark[a[i]]);///按顺序输出即可
}
}
return 0;
}