POJ 1451 T9 G++ trie树 dfs

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
//英语     看博友分析   trie树   dfs   
struct nod{
	int sum;
	int p[26];
}da[10000];
int js; 
int mp[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
string ss;
int mx;
char tmp[10000];
char jg[10000];
void dfs(int pp,int x,int mn)
{
	if(x==mn)
	{
		if(da[pp].sum>mx)
		{
			mx=da[pp].sum;
			for(int i=0;i<mn;i++)
			{
				jg[i]=tmp[i];
			}
		}
		return;
	}
	int t=ss[x]-'0';
	for(int i=0;i<26;i++)
	{
		if(da[pp].p[i]!=-1&&mp[i]==t)
		{
			tmp[x]=i+'a';			
			dfs(da[pp].p[i],x+1,mn);
		}
	}
}
int main()
{
	int T;
	cin>>T;
	int tag=0;
	while(T--)
	{
		int n;
		cin>>n;
		for(int i=0;i<10000;i++)
		{
			da[i].sum=0;
			for(int j=0;j<26;j++)
			{
				da[i].p[j]=-1;
			}
		}
		js=0;
		for(int i=0;i<n;i++)
		{
			string s;
			int a;
			cin>>s>>a;
			int tp=0;
			for(int j=0;j<s.size();j++)
			{
				if(da[tp].p[s[j]-'a']==-1)
				{
					da[tp].p[s[j]-'a']=++js;
					tp=js;
					da[tp].sum=a;
				}else
				{
					tp=da[tp].p[s[j]-'a'];
					da[tp].sum+=a;
				}
			}
		}
		int m;
		cin>>m;
		tag++;
		cout<<"Scenario #"<<tag<<":"<<endl;
		while(m--)
		{			
			cin>>ss;			
			int tp=0;
			for(int i=0;i<ss.size()-1;i++)
			{
				mx=-1;
				dfs(0,0,i+1);
				if(mx!=-1)
				{
					for(int j=0;j<=i;j++)
					{
						cout<<jg[j];
					}					
				}else
				{
					cout<<"MANUALLY";
				}
				cout<<endl;
			}
			cout<<endl;			
		}
		cout<<endl;
	}
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值