dfs+字典树
(方法很暴力。。)
#include<cstdio>
#include<cstring>
#include<cstdlib>
const int Max=26;
using namespace std;
struct trie{
struct trie * next[Max];
int flag;
trie(){
flag=0;
for( int i = 0; i < 26; i++ )
next[i] = NULL;
}
}node;
struct trie * root;
char ans[120],temp[120];
int max;
char f[15][6]={{""},{""},{"abc"},{"def"},{"ghi"},{"jkl"},{"mno"},{"pqrs"},{"tuv"},{"wxyz"}};
void insert(char * str,int fre){
int i,len,tem;
struct trie* p,*q;
p=root;
len=strlen(str);
for(i=0;i<len;i++){
tem=str[i]-'a';
if(p->next[tem]!=NULL){
p=p->next[tem];
p->flag+=fre;
}
else{
q=(struct trie *)calloc(1,sizeof(struct trie ));
p->next[tem]=q;
p=q;
p->flag+=fre;
}
}
}
void search(int num,int pos,struct trie * tem,char * str){
struct trie * p;
int i,len;
int thislevel=str[pos]-'0';
len=strlen(f[thislevel]);
for(i=0;i<len;i++){
if(tem->next[f[thislevel][i]-'a']==NULL)
continue;
temp[pos]=f[thislevel][i];
p=tem->next[f[thislevel][i]-'a'];
if(pos==num){
if(p->flag>max){
max=p->flag;
temp[pos+1]='\0';
strcpy(ans,temp);
}
}
else
search(num,pos+1,p,str);
}
}
void find(char * str){
int i,len,tem;
struct trie * p;
p=root;
len=strlen(str);
for(i=0;i<len-1;i++){
max=0;
search(i,0,root,str);
if(max==0){
printf("MANUALLY\n");
i++;
break;
}
else
printf("%s\n",ans);
}
while(i<len-1){
printf("MANUALLY\n");
i++;
}
}
int main(){
int T,t,n,i;
char s[120];
int fre;
int yes;
scanf("%d",&T);
for(t=1;t<=T;t++){
printf("Scenario #%d:\n",t);
scanf("%d",&n);
root=(struct trie *)calloc(1,sizeof(node));
for(i=1;i<=n;i++){
scanf("%s %d",s,&fre);
insert(s,fre);
}
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%s",s);
find(s);
printf("\n");
}
printf("\n");
}
}