hdu 1298 T9

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1298


字典树+DFS。。


字典树用STL真吃香。 。。


下面是AC代码:

#include<iostream>
#include<map>
#include<string>
using namespace std;
char str[100];
string res;
char ch[10][10];
int maxval;
map<string ,int> mm;

void set()  
{  
    strcpy(ch[0], "");  
    strcpy(ch[1], "");  
    strcpy(ch[2], "abc");  
    strcpy(ch[3], "def");  
    strcpy(ch[4], "ghi");  
    strcpy(ch[5], "jkl");  
    strcpy(ch[6], "mno");  
    strcpy(ch[7], "pqrs");  
    strcpy(ch[8], "tuv");  
    strcpy(ch[9], "wxyz");  
} 
void dfs(string tt,int cur,int s)
{
	if(cur==s)
	{
		if(maxval<mm[tt])
		{
			maxval=mm[tt];
			res=tt;
		}
	}
	else
	{
		int k=str[cur+1]-'0',i;

		int len=strlen(ch[k]);
	//	cout<<k<<endl;
		for(i=0;i<len;i++)
		{
			string temp=tt;
			temp+=ch[k][i];
		//	cout<<mm[temp]<<endl;
		
			if(mm[temp])
			dfs(temp,cur+1,s);
		}
	}

}

int main(){
	int t,p,i,n;
	int ca=1;
	string temp=str,k="";
	cin>>t;
	set();
	while(t--){


		cin>>n;

		while(n--){
			scanf("%s",str); cin>>p;
			temp=str;   k=""; 
			for(i=0;i<temp.size();i++)
			{
			   k+=temp[i];
			   mm[k]+=p;
			}
		}
		cin>>n;
		printf("Scenario #%d:\n",ca++);
		while(n--)
		{
			cin>>str;
			for(i=0;i<strlen(str)-1;i++)
			{
				maxval=-1;
				string tt="";
				dfs(tt,-1,i);

			    if(maxval != -1) cout<<res<<endl;  
                else printf("MANUALLY\n");  
			}
			printf("\n");
		}

		printf("\n");
		mm.clear();
	}


	return 0;
}


你可能感兴趣的:(hdu 1298 T9)