字典树+dfs,不想说些什么
#include<iostream>
#include<cstdio>
using namespace std;
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 f[8]={3,3,3,3,3,4,3,4};
int n,m,d,flag,casee=1;
string str,ans,re;
struct stu
{
int count;
stu* a[26];
stu()
{
for(int i=0;i<26;i++) a[i]=NULL;
count=0;
}
};
stu* p;
void build(stu* root,int cnt)
{
if(cnt==str.size()) return;
int x=str[cnt]-'a';
if(root->a[x]==NULL) root->a[x]=new stu();
root=root->a[x];
root->count+=d;
build(root,cnt+1);
}
void dfs(stu* root,int s,int e)
{
if(s==e)
{
if(flag<root->count)
{
flag=root->count;
re=ans;
}
return ;
}
int x=str[s]-'2';
//if(x==-1) return;
for(int i=0;i<f[x];i++)
{
int call=phone[x][i];
if(root->a[call]!=NULL)
{
ans+=('a'+call);
dfs(root->a[call],s+1,e);
ans.erase(ans.size()-1,1);
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
p=new stu();
cin>>n;
for(int i=0;i<n;i++)
{
cin>>str>>d;
build(p,0);
}
cin>>m;
printf("Scenario #%d:\n",casee++);
while(m--)
{
cin>>str;
for(int j=1;j<str.size();j++)
{
ans="";
flag=-1;
dfs(p,0,j);
if(flag!=-1) cout<<re<<endl;
else printf("MANUALLY\n");
}
printf("\n");
}
printf("\n");
}
return 0;
}