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