HDU4287

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;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值