开始我算法复杂度估计错误,纠结了很久,没想到直接深搜穷举。
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1298
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 30
struct Trie{
Trie * next[maxn];
int v;
};
Trie * root;
int phone[8][4]={{0,1,2},{3,4,5},{6,7,8},{9,10,11},{12,13,14},{15,16,17,18},{19,20,21},{22,23,24,25}};
int re[8]={3,3,3,3,3,4,3,4};
char en[105];
char ans[105];
int pp;
void Init_Trie(){
root = (Trie *)malloc(sizeof(Trie));
for(int i=0;i<maxn;i++){
root -> next[i] = NULL;
}
}
void Add_Trie(int value,char * str){
Trie * p = root , * q;
for(int i=0;str[i]!='\0';i++){
int id = str[i] - 'a';
if(p->next[id]==NULL){
q = (Trie *)malloc(sizeof(Trie));
q -> v = value;
for(int j=0;j<maxn;j++){
q -> next[j] = NULL;
}
p -> next[id] = q;
p = p -> next[id];
}
else {
p = p -> next[id];
p->v +=value;
}
}
}
void dfs(Trie * p,char * a,int now,int len)
{
if(now==len)
{
if(pp<p->v)
{
pp=p->v;
for(int i=0;i<len;++i)
en[i]=ans[i];
en[len]=0;
}
return;
}
int t=a[now]-'2';
for(int i=0;i<re[t];i++)
{
int id=phone[t][i];
if(p->next[id]!=NULL)
{
ans[now]='a'+id;
dfs(p->next[id],a,now+1,len);
}
}
return;
}
void Del_Trie(Trie * p){
for(int i=0;i<maxn;i++){
if(p->next[i])Del_Trie(p->next[i]);
}
free(p);
}
void input(){
int T,t=1;
scanf("%d",&T);
while(T--){
printf("Scenario #%d:\n",t++);
Init_Trie();
int n;
scanf("%d",&n);
char a[105];
int value;
for(int i=0;i<n;i++){
scanf("%s %d",a,&value);
Add_Trie(value,a);
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%s",a);
for(int j=1;j<strlen(a);j++){
pp = 0;
dfs(root,a,0,j);
if(pp){
puts(en);
}
else
puts("MANUALLY");
}
if(i<m-1){
puts("");
}
}
puts("");
puts("");
Del_Trie(root);
}
}
void File(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
int main(){
//File();
input();
return 0;
}