http://acm.hdu.edu.cn/showproblem.php?pid=1298
题意:有一堆有权值的单词,求每按一个按钮,相应权值最大的单词(或前缀)。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=105;
bool flag;
int map[10][5]= {{0},{0},{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 len[10]={0,0,3,3,3,3,3,4,3,4};
int save[NM],mmax;
char str[NM];
struct Node{
Node *next[26];
int ps;
Node(){
for(int i=0;i<26;i++)
next[i]=NULL;
ps=0;
}
};
void Build(Node *pt,char *s,int ps){
int i,t,len;
len=strlen(s);
for(i=0;i<len;i++){
t=s[i]-'a';
if(pt->next[t]==NULL)
pt->next[t]=new Node();
pt=pt->next[t];
pt->ps+=ps;
}
}
void DFS(int level,int t,char *s,Node *pt){
int i,j,temp;
if(t==level){
flag=true;
if(pt->ps>mmax){
mmax=pt->ps;
for(j=0;j<level;j++) str[j]=save[j]+'a';
}
return;
}
temp=s[t]-'0';
for(i=0;i<len[temp];i++){
if(pt->next[map[temp][i]]!=NULL){
save[t]=map[temp][i];
DFS(level,t+1,s,pt->next[map[temp][i]]);
}
}
}
int main()
{
int i,j,n,m,k,ps,T;
char cs[NM];
k=1;
scanf("%d",&T);
while(T--){
printf("Scenario #%d:\n",k++);
Node *pt=new Node();
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s%d",cs,&ps);
Build(pt,cs,ps);
}
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%s",cs);
//1代表数字串结尾
for(j=0;cs[j]!='1';j++){
mmax=0;flag=false;
memset(str,0,sizeof(str));
DFS(j+1,0,cs,pt);
if(flag) printf("%s\n",str);
else printf("MANUALLY\n");
}
printf("\n");
}
printf("\n");
}
return 0;
}