POJ 1451 T9【字典树】

 题意: 模拟手机的输入,手机每个按键负责一定数量的字符,知道了一些单词,和这些单词的使用频率,给出一个按键的顺序,问每个数字所在位置对应的最大可能的输入

         单词是哪个,如果找不到 输出‘MANUALLY‘

分析:建立字典树,把单词存起来,并累加每个字母使用的频率,每出现输入的一个数字,找出那个数字上对应的字母所在位置频率最大的单词。

 

#include<stdio.h>
#include<string.h>
#define clr(x)memset(x,0,sizeof(x))
char res[105];
char tmp[105];
int  la;
struct node
{
    int count;
    node *next[26];
    node()
    {
        count=0;
        clr(next);
    }
};
char op[10][5]={{"\0"},{"\0"},{"abc"},{"def"},{"ghi"},
{"jkl"},{"mno"},{"pqrs"},{"tuv"},{"wxyz"}};
void add(char *s,node *root,int num)
{
    int i=0,x;
    node *p=root;
    while(s[i])
    {
        x=s[i]-'a';
        if(p->next[x]==NULL)
            p->next[x]=new node();
        p=p->next[x];
        p->count+=num;
        i++;
    }
}
void find(int le,int pos,node *root,char *s)
{
    int n,i,x,k;
    node *p=root;
    k=s[pos]-'0';
    n=strlen(op[k]);
    
    for(i=0;i<n;i++)
    {
        x=op[k][i]-'a';
        if(p->next[x]==NULL)
            continue;
        res[pos]=op[k][i];
        if(pos==le)
        {
            if(p->next[x]->count>la)
            {
                la=p->next[x]->count;
                strcpy(tmp,res);
            }
        }
        else find(le,pos+1,p->next[x],s);
    }
}
int main()
{
    char s[105];
    int t,m,num,ca=1,len,i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&m);
        node *root;
        root=new node();
        while(m--)
        {
            scanf("%s%d",s,&num);
            add(s,root,num);
        }
        printf("Scenario #%d:\n",ca++);
        scanf("%d",&m);
        while(m--)
        {
            scanf("%s",s);
            len=strlen(s);
            for(i=0;i<len-1;i++)
            {
                la=0;
                clr(res);
                find(i,0,root,s);
                if(la==0)
                    break;
                else printf("%s\n",tmp);
            }
            for(;i<len-1;i++)
                printf("MANUALLY\n");
            printf("\n");
        }
        printf("\n");
    }

    return 0;
}
posted @ 2012-08-07 10:43  'wind  阅读(163)  评论(0编辑  收藏  举报