(??`ω´?)智能手机
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\n",Sign[Num[i]]); 39 } 40 } 41 return 0; 42 }
时间: 2024-11-06 20:00:53