zoj 1038 T9 mobile input method

来源:互联网 发布:网络怒怼什么意思 编辑:程序博客网 时间:2024/05/16 16:20
#include <cstdlib>#include <iostream>#include <cstring>using namespace std;struct Key{       int num;       char ch[4];};const Key keys[10] = {   {}, {},             {3, {'a', 'b', 'c'}}, {3, {'d', 'e', 'f'}},    {3, {'g','h','i'}}, {3, {'j', 'k', 'l'}},   {3, {'m','n','o'}},    {4, {'p', 'q','r', 's'}},  {3, { 't', 'u', 'v'}}, {4,{'w', 'x','y','z'}}};void printKeyBoard(){   for (int i = 2; i < 10; i++)   {       cout<<"Key "<<i<<":";       for (int j = 0; j < keys[i].num; j++)         cout<<keys[i].ch[j];       cout<<endl;   }}struct MyWord{       char s[101];       int len;       int freq;       bool prefix;};MyWord word[1001];int    tFreq[1001];int nWords;inline void readScenario(){     cin>>nWords;     for (int i = 0; i < nWords; i++)     {         cin>>word[i].s>>word[i].freq;         word[i].len = strlen(word[i].s);     }}inline void markWords(char qry[], int n){    for (int i = 0; i < nWords; i++)    {       if (!word[i].prefix ) continue;       else if (word[i].len < n) { word[i].prefix = false; continue; }       int k;       for (k = 0; k < keys[qry[n-1]].num; k++)            if (keys[qry[n-1]].ch[k] == word[i].s[n-1]) break;       word[i].prefix  =  k<keys[qry[n-1]].num;    }}inline void mostFreqStr(char qry[], int n, char* s){     markWords(qry, n);     for (int i = 0; i < nWords; i++)     {         tFreq[i] = 0;         if ( !word[i].prefix ) continue;         for (int j = 0; j < nWords; j++)            if (word[j].prefix && 0 == strncmp(word[i].s, word[j].s, n))              tFreq[i] += word[j].freq;     }     int idx = -1, max = -1;     for(int i = 0; i < nWords; i++)       if (word[i].prefix && max < tFreq[i]) { idx = i; max = tFreq[i]; }     if (max == -1)     {             strcpy(s, "MANUALLY/0");             return ;     }     strncpy(s, word[idx].s, n);     s[n] = '/0';     return ;}int main(){    //printKeyBoard();    int t;// test cases    int n; //Num of query strings    char query[101]; char s[101];    cin>>t;    for (int k = 1; k <= t; k++)    {        cout<<"Scenario #"<<k<<":"<<endl;        readScenario();        cin>>n;        for (int i = 0; i < n; i++)        {            int j;            for (j = 0; j < nWords; j++) word[j].prefix = true;            j = 0;             while (cin>>query[j], query[j] -= '0', query[j++] != 1)            {                 mostFreqStr(query, j, s);                 cout<<s<<endl;            }            cout<<endl;        }        cout<<endl;    }}