hdu-(1298手機相關 dfs+字典樹)

來源:互聯網
上載者:User

標籤:style   blog   class   c   code   tar   

題目大意: 在以前,手機IME很麻煩,因為只有9個鍵,而字母有26個,所以一個鍵上同時包含這幾個字母,這樣的話,為了打出一個字母可能要按幾次。比如鍵5有“JKL”, 如果要輸入K,那麼就要連按兩次。 這樣的IME很麻煩。所以一家公司發明了T9技術IME。這種IME內建這很多英語單詞,它可以根據英語出現的頻率,是否存在等資訊,每個字母只要按一次,就可以有想要的預選單詞。 例如,假設IME只內建了一個單詞“hell”, 那麼只需要按4355便可以出來。 注意,如果有一個單詞hell, 那麼這個單詞的所有首碼,h, he, hel, 也當作是存在的

Sample Input2 5 hell 3 hello 4 idea 8 next 8 super 3 2 435561 43321 7 another 5 contest 6 follow 3 give 13 integer 6 new 14 program 4 5 77647261 6391 4681 26684371 77771 

 

Sample OutputScenario #1: i id hel hell hello i id ide idea Scenario #2: p pr pro prog progr progra program n ne new g in int c co con cont anoth anothe another p pr MANUALLY MANUALLY
#include<iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;const int KIND = 26;const int MAXN = 15000;int cnt_node;vector<int>g[10];char input[105];char ans[105];int num, Max;bool flag;struct node{    int prefix;    node *next[KIND];    void init(){        prefix=0;        memset(next, 0, sizeof(next));    }}Heap[MAXN];inline node* newNode(){    Heap[cnt_node].init();    return &Heap[cnt_node++];}void insert(node *root, char *str, int n){    for(char *p=str; *p; ++p){        int ch=*p-‘a‘;        if(root->next[ch]==NULL)            root->next[ch] = newNode();        root = root->next[ch];        root->prefix += n;    }}void dfs(node *root, char *str, int pos){ //str儲存輸出結果    if(root==NULL)return;    if(pos >= num){        if(root->prefix > Max){            strcpy(ans, str);            Max=root->prefix;        }         flag=true;        return ;    }    int u=input[pos]-‘0‘;    for(int i=0; i<g[u].size(); ++i){        str[pos] = g[u][i]+‘a‘;        dfs(root->next[g[u][i]], str, pos+1);        str[pos] = 0;    }}int main(){    int T,n,p,cas=1;    char str[105];    // 鍵盤設定, 貌似這樣寫複雜了...    for(int i=0; i<10; ++i) g[i].clear();    g[2].push_back(0), g[2].push_back(1), g[2].push_back(2);    g[3].push_back(3), g[3].push_back(4), g[3].push_back(5);    g[4].push_back(6), g[4].push_back(7), g[4].push_back(8);    g[5].push_back(9), g[5].push_back(10), g[5].push_back(11);    g[6].push_back(12), g[6].push_back(13), g[6].push_back(14);    g[7].push_back(15), g[7].push_back(16), g[7].push_back(17),g[7].push_back(18);    g[8].push_back(19), g[8].push_back(20), g[8].push_back(21);    g[9].push_back(22), g[9].push_back(23), g[9].push_back(24), g[9].push_back(25);    scanf("%d",&T);    while(T--){        scanf("%d",&n);        printf("Scenario #%d:\n", cas++);                // Trie init        cnt_node=0;        node *root = newNode();        for(int i=0; i<n; ++i){            scanf("%s %d",str,&p);            insert(root, str, p);        }        scanf("%d",&n);        for(int i=0; i<n; ++i){            scanf("%s", input);            for(int j=0; j<strlen(input)-1; ++j){                memset(str, 0, sizeof(str));                Max=-1;                num=j+1;                flag=false;                dfs(root, str, 0);                if(flag) puts(ans);                else puts("MANUALLY");            }            puts("");        }        puts("");    }      return 0;}
View Code

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.