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; }