(。・`ω´・)智能手机

(。・`ω´・)智能手机

TimeLimit: 2000/1000 MS (Java/Others)  MenoryLimit: 32768/32768 K (Java/Others)
64-bit integer IO format:%I64d
 
Problem Description
在大家都有手机的今天。我们必须熟悉手机上的智能英文输入法。具体地讲,数字按钮可对应于英文字母分别如下所示: 
  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 
当我们想输入字符串“ming”,我们需要按下数字键 9, 4, 6, 4,然后输入法会手机字典中选择,所有符合拼音的单词。 
现在,问题来了,给你N组数字键的按键顺序,以及M组字符串,根据每一组的数字键的按键顺序,可以拼凑出多少个单词、
Input
  第一行输入T,表示有T组测试案例,每组测试案例按照下述操作进行: 
  第一行输入两个整数r N (1 <= N <= 5000),和M (1 <= M <= 5000),表示有N组数字键的按键顺序和M组字符串。 
  接下来有N行,每一行输入不超过6位数的数字,表示一组按键顺序。 
  再下来有M行,每一行输入一串不超过6个字符的字符串。  
Output
   每组测试案例,根据所给的按键顺序,在M个字符串中,统计能够形成多少个匹配的字符串、 
SampleInput

1
3 4
46
64448
74
ho
oight
mihgt
go
SampleOutput
2
2
0

代码(映射一下就好了,简单哈希):
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 #define Max 1008611
 6 int Sign[Max];
 7 int To[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};
 8 int Deal(char str[])
 9 {
10     int i,Sum=0,Len=strlen(str);
11     for(i=0;i<Len;i++)
12     {
13         Sum=Sum*10+To[str[i]-'a'];
14     }
15     return Sum;
16 }
17 int main()
18 {
19     int T,N,M,i,j;
20     int Num[5117];
21     char Str[5117];
22     scanf("%d",&T);
23     while(T--)
24     {
25         memset(Sign,0,sizeof(Sign));
26         scanf("%d%d",&N,&M);
27         for(i=0;i<N;i++)
28         {
29             scanf("%d",&Num[i]);
30         }
31         for(i=0;i<M;i++)
32         {
33             scanf(" %s",Str);
34             Sign[Deal(Str)]++;
35         }
36         for(i=0;i<N;i++)
37         {
38             printf("%d
",Sign[Num[i]]);
39         }
40     }
41     return 0;
42 }
View Code
转载请备注:
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************
原文地址:https://www.cnblogs.com/Wurq/p/4693303.html