题目大意:
模拟手机键盘输入,给出一组字符串单词以及单词的频率,接着给出一串数字,相当于模拟咱们在手机键盘输入,对于每个数字,输出频率最大的字符串;
代码实现:
#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");
}
}