您的位置:首页 > 其它

[字典树]poj 1451 T9

2012-08-08 14:11 441 查看
/**
[字典树]poj 1451 T9
在hdu 1298 上WA了。
*/
#include <stdio.h>
#include <string.h>

#define N 50000

struct tireTree
{
int cnt;
tireTree *child[26];
}tt
,*spt;

void insert(char *s,int p,tireTree *&rt)
{
tireTree *loc;
loc = rt;
int num;
for(int i = 0; s[i]; ++i)
{
num = s[i] - 'a';
if(loc->child[num] == NULL)
loc->child[num] = spt++;
loc = loc->child[num];
loc->cnt += p;
}
}
char t9[10][6] = {",",",","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
char wr[11],word[13][13];
char s[11];
int pp[11];
void query(tireTree *rt,int t)
{
if(t > 0)
{
if(rt->cnt > pp[t-1])
{
pp[t-1] = rt->cnt;
for(int i = 0; i < t; ++i)
word[t-1][i] = wr[i];
}
}
if(s[t] == '1')
return ;
int i = s[t] - '0',j,num;
for(j = 0; t9[i][j]; ++j)
{
num = t9[i][j] - 'a';
if(rt->child[num])
{
wr[t] = t9[i][j];
query(rt->child[num],t+1);
}
}
}
int main()
{
int t,n,i,p,cas = 0;
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
scanf("%d",&t);
while(t--)
{
memset(tt,0,sizeof(tt));
spt = tt;
tireTree *rt;
rt = spt++;
scanf("%d",&n);
while(n--)
{
scanf("%s %d",s,&p);
insert(s,p,rt);
}
printf("Scenario #%d:\n",++cas);
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
memset(pp,0,sizeof(pp));
query(rt,0);
for(i = 0; s[i] != '1'; ++i)
{
if(pp[i] == 0)
printf("MANUALLY\n");
else
{
for(int j = 0; j <= i; ++j)
printf("%c",word[i][j]);
puts("");
}
}
puts("");
}
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: