HDU -- 1298 T9 (Trie 树+dfs)

来源:互联网 发布:mac os沙盒 编辑:程序博客网 时间:2024/05/16 07:45

题目大意:

模拟手机键盘输入,给出一组字符串单词以及单词的频率,接着给出一串数字,相当于模拟咱们在手机键盘输入,对于每个数字,输出频率最大的字符串;

代码实现:

#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>using namespace std;char word[110],res[110],tmp[110];char phone[10][4]={{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'},{'m','n','o'},{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}};int num[10]={3,3,3,3,3,4,3,4},flag,max_p;struct tree{    int cnt;    tree *next[26];}*root;tree *Create(){    tree *p;    p=(tree *)malloc(sizeof(tree));    p->cnt=0;    for(int i=0;i<26;++i) p->next[i]=NULL;    return p;}void Insert(char *word,int k){    tree *p=root;    int i=0,x,l=strlen(word);    while(i<l){        x=word[i++]-'a';        if((p->next[x])==NULL) p->next[x]=Create();        p=p->next[x];        p->cnt+=k;    }}void Search(int l,int len,tree *p){    if(l==len){        flag=1;        if(p->cnt>max_p){            max_p=p->cnt;            for(int i=0;i<len;++i) res[i]=tmp[i];            res[len]='\0';        }        return;    }    int pos=word[l]-'2',x;    char t;    for(int i=0;i<num[pos];++i){        t=phone[pos][i];        x=t-'a';        if((p->next[x])==NULL) continue;        tmp[l]=t;        Search(l+1,len,p->next[x]);    }}int main(){    int t,c=0,n,p,m,mark;    scanf("%d",&t);    while(t--){        printf("Scenario #%d:\n",++c);        scanf("%d",&n);        root=Create();        for(int i=0;i<n;++i){            scanf("%s %d",word,&p);            Insert(word,p);        }        scanf("%d",&m);        for(int i=0;i<m;++i){            mark=0;            scanf("%s",word);            int l=strlen(word);            for(int j=0;j<l-1;++j){                flag=0,max_p=0;                if(!mark) Search(0,j+1,root);                if(flag) printf("%s\n",res);                else printf("MANUALLY\n"),mark=1;            }            printf("\n");        }        printf("\n");    }}


0 0
原创粉丝点击