天天看點

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