zoukankan      html  css  js  c++  java
  • hdu-(1298手机相关 dfs+字典树)

    题目大意: 在以前,手机输入法很麻烦,因为只有9个键,而字母有26个,所以一个键上同时包含这几个字母,这样的话,为了打出一个字母可能要按几次。比如键5有“JKL”, 如果要输入K,那么就要连按两次。 这样的输入法很麻烦。所以一家公司发明了T9技术输入法。这种输入法内置这很多英语单词,它可以根据英语出现的频率,是否存在等信息,每个字母只要按一次,就可以有想要的预选单词。 例如,假设输入法只内置了一个单词“hell”, 那么只需要按4355便可以出来。 注意,如果有一个单词hell, 那么这个单词的所有前缀,h, he, hel, 也当作是存在的

    Sample Input
    2 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 Output
    Scenario #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:
    ", 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
     
  • 相关阅读:
    Shell基础:变量类型 & 运算符
    Ant基础入门
    Shell基础:Shell和Mysql交互
    Linux配置邮箱发送(MUTT/MSMTPQ)
    [转载]JMeter源码导入Eclipse
    [转载]Badboy使用教程
    工程目录 Java/Web/Maven
    Maven基础知识和环境搭建
    Github/Eclipse管理Maven项目
    Git分支管理详解
  • 原文地址:https://www.cnblogs.com/baoluqi/p/3744807.html
Copyright © 2011-2022 走看看