首页 > 其他分享 >poj 1451(Trie)

poj 1451(Trie)

时间:2023-05-29 22:34:13浏览次数:33  
标签:node 频数 Trie pos next 单词 int poj 1451


题意:就是让你模拟手机输入单词。具体就是给你一些单词,以及该单词被使用的频数,这个频数也是该单词前缀的使用频数,当然不同的单词有可能有相同的前缀,那么这个相同的前缀的使用频数就是这两个单词使用频数之和,以此类推。然后再给你一些数字串,让你针对该数字串的每一个前缀输出它的最有可能对应的单词(即频数最大的字符串)。


解题思路:这道题目比我想象中的简单,直接dfs去搜,因为每个键的字母个数不超过5,所以不会TLE。。。



#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

struct node
{
	struct node *next[26];
	int p;
	node()
	{
		p = 0;
		for(int i = 0; i < 26; i++)
			next[i] = NULL;
	}
};
int n,pro;
char s[100],keyboard[10][5]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
char ans[100],tmp[100];

void add(char *str,int cnt,node *root)
{
	node *t = root;
	for(int i = 0; str[i] != 0; i++)
	{
		if(t->next[str[i]-'a'] == NULL)
		{
			t->next[str[i]-'a'] = new node();
		}
		t = t->next[str[i]-'a'];
		t->p += cnt;
	}
}

void dfs(int x,int pos,node *r)
{
	int num = s[pos] - '0';
	int len = strlen(keyboard[num]);
	for(int i = 0; i < len; i++)
	{
		int t = keyboard[num][i] - 'a';
		if(r->next[t] == NULL) continue;
		else tmp[pos] = keyboard[num][i];
		if(pos == x)
		{
			if(pro < r->next[t]->p)
			{
				pro = r->next[t]->p;
				strcpy(ans,tmp);
			}
		}
		else dfs(x,pos+1,r->next[t]);
	}
}

int main()
{
	int t,p,cas = 1;
	node *root;
	scanf("%d",&t);
	while(t--)
	{
		root = new node();
		scanf("%d",&n);
		for(int i = 1; i <= n; i++)
		{
			getchar();
			scanf("%s %d",s,&p);
			add(s,p,root);
		}
		printf("Scenario #%d:\n", cas++);
		scanf("%d",&n);
		for(int i = 1; i <= n; i++)
		{
			getchar();
			scanf("%s",s);
			int len = strlen(s);
			for(int j = 0; j < len-1; j++)
			{
				memset(tmp,0,sizeof(tmp));
				pro = 0;
				dfs(j,0,root);
				if(pro == 0)
					printf("MANUALLY\n\n");
				else printf("%s\n\n",ans);
			}
		}
	}
	return 0;
}



标签:node,频数,Trie,pos,next,单词,int,poj,1451
From: https://blog.51cto.com/u_16143128/6374332

相关文章

  • poj 1190(剪枝)
    生日蛋糕TimeLimit: 1000MS MemoryLimit: 10000KTotalSubmissions: 16191 Accepted: 5751Description7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体。 设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri,高度为Hi的圆......
  • poj 3281(最大流)
    解题思路:这是道匹配的问题,最近刚学网络流,所以想用网络流去做。。按照题目要求,我开始建立的是food----cow----drink的图,源点与所有的food的编号连接,所有的drink的编号与汇点连接,这里所有的有向边的容量都为1,。。但很不幸的是WA了。。看了别人的思路,我才知道原来这里保证不了一头牛......
  • poj 1935(搜索+回溯)
    解题思路:先我们考虑从源点出发到所有自己想要经过的点然后在回到源点sum,显然每条边都必须经过源点(这个我们可以一次dfs求出),但题目的意思是可以不用回到源点,那么我们可以再求源点到所有要经过的点的最远距离ans,于是答案便是sum-ans.这道题的思路确实是很巧妙,一开始我还是在想如......
  • poj 2346(DP)
    题意:n位数,满足前n/2个数字之和同后n/2个数字之和相同的数一共有多少个?解题思路:dp[i][j]表示前i个数的和为j时,有多少个;递推关系:dp[i][j]+=dp[i-1][k],k表示前i-1个数的和,由于每一位只能是0-9,所以有限制条件:9>=j - k>=0由于对称性,只需要枚举到n/2即可,剩下的就是简单的乘法......
  • poj 2415(BFS)
    题意: 有一种游戏,共有三个piece(不妨称为棋子),棋盘是由N个点构成的完全图,边有颜色。每次可以移动一个棋子,移动时必须满足棋子走过的边的颜色和其他两个棋子之间的连边的颜色一致。求把三个棋子移到同一个顶点的最少次数。这道题是一个很简单的BFS,但为何一直TLE。。。。#include<ios......
  • poj 1054
    解题思路:这道题其实比较简单,就是找斜率相同且间距相同的点。首先,就是要找到两点,确定好斜率,然后就判断这两点是否在起始位置。其次,确定好斜率就确定了两个点之间的距离,如果某两点之间的间距不满足的话,那么这个点肯定不是这个方向上的。#include<iostream>#include<cstdio>#include......
  • poj 2010(优先队列)
    题意:奶牛大学:奶大招生,从C头奶牛中招收N头。它们分别得分score_i,需要资助学费aid_i。希望新生所需资助不超过F,同时得分中位数最高。求此中位数。解题思路:这里要求最大中位数,中位数肯定是在这些人中间,故可以枚举中位数,可以先对分数进行排序,然后用二分去找最大中位数。每次枚举的中位......
  • poj 1948(搜索+剪枝)
    解题思路:这道题看到数据量,想到应该搜索+剪枝应该可以过。。可是别人的A了,我的却超时了。。。我用了一个mark[a][b],表示前两条边长度分别为a和b时,是否已经处理过,如果是的话就直接跳出。。。剩下的就是一个比较简单的搜索过程了,代码不难写,但是确实超时不可避免。。#include<iostream>......
  • poj 1604
    题意:计算n!最后一位不为0的数解题思路:1*2*3*......*n,每次乘完一个数后,把末尾0去掉,然后模上一个数,这样算出来的数肯定是最后一位不为0的数。。注意这里模的数不能太小,同时也不能太大,太小可能会影响乘积的效果,譬如可能出现0的情况被之前的模运算给抹掉了,太大就直接溢出了。。。参考了......
  • poj 2078(搜索+剪枝)
    解题思路:可以一行一行地递归求解,要是不符合条件就回溯,注意最后一行不能够移动它,因为可能会与之前重叠。。#include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;constintmaxn=8;intn,mat[maxn][maxn],ans;intget_max(intdep){ intm=......