LA3942 Remember the Word(字典树+记忆化搜索)

原创 2015年08月03日 19:58:11

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=22109

题意:给出一个由S个不同单词组成的字典和一个长字符串。把这个字符串分解成若干个单词的连接(单词可以重复使用),由多少种方法?比如,有4个单词a,b,cd,ab,则abcd有两种分解方法:a+b+cd和ab+cd

分析:首先将输入的字典建成字典树。然后记忆化搜索~

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 4e5+6;
const int mod =20071027;

int dp[maxn]; 
int son[maxn][26],cur,Len;
int end[maxn];
char ss[maxn],st[maxn];
int newnode()
{
	end[cur]=0;
	fill(son[cur],son[cur]+26,-1); 
	return cur++;
}
void Clear()
{
	cur=0;
	newnode();
}
void Insert(char str[])
{
	int len=strlen(str),index,i,root=0;
	for(i=0;i<len;i++)
	{
		index=str[i]-'a';
		if(son[root][index]==-1)
			son[root][index]=newnode();
		root=son[root][index];
	}
	end[root]++;
}

int Query(int start)
{
	if(start>=Len)
		return 1;
	if(dp[start]!=-1)
		return dp[start];
	int ret(0),index,i,root=0;
	for(i=start;i<Len;i++)
	{
		index=ss[i]-'a';
		if(son[root][index]!=-1 && end[son[root][index]])
			ret+=Query(i+1)%mod;
		if(son[root][index]==-1)
			return dp[start]=ret%mod;
		root=son[root][index];
	}
	return dp[start]=ret%mod;
}

int main()
{
	int ncase=1,n;
	while(scanf("%s%d",ss,&n)!=EOF)
	{
		Clear();
		Len=strlen(ss);
		fill(dp,dp+Len+1,-1);
		while(n--)
		{
			scanf("%s",st); 
			Insert(st);
		}
		printf("Case %d: %d\n",ncase++,Query(0));
	}
	return 0;
}

版权声明:转吧。

相关文章推荐

UVALive 3942 (LA 3492) Remember the Word Trie树 + 记忆化搜索

题目大意: 白书例题 给出由S个不同单词组成的字典和一个长字符串. 把这个字符串分解成若干个单词的连接, 单词可以重复使用, 问有多少种分解方法 单词个数1 大致思路: 首先将S个单词插入Tri...

UVA 1401 & LA 3942 Remember the Word 字典树+DP

题意:给你一个字符串 再给你若干单词 问你这些单词有多少种组合方式可以组合成所给的字符串 思路:不难想到递推方程 dp[i] = sum(dp[i+len(x)]|x是从i开始的字符串的前缀单词) ...
  • s_h_r
  • s_h_r
  • 2015-06-19 15:02
  • 258

UVALive 3942 Remember the Word(字典树+dp)

题意: 给定一个长度不超过30000的字符串SS,然后给定n(n<=4000)个长度不超过100的字符串aia_i,问用aia_i组合成SS有多少种方案数,由于数量可能很大,最终结果mod 200...

UVALive 3942 - Remember the Word(DP,字典树)

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&...

uvalive 3942 Remember the Word 字典树+dp

代码:

LA 3942 Remember the Word(前缀树&树上DP)

3942 - Remember the Word Neal is very curious about combinatorial problems, and now here comes ...

单词拆解&前缀树&树上DP LA 3942 Remember the Word

给定一些单词,和一个长串,问这个长串拆分成已有单词,能拆分成几种方式

Uva1401/LA3942 Remember the Word(trie模板)

LRJ书上例题,但是自己在思考过程中挺有收获。。。。 UVA1401题目直达 题目大意是拆解字符串,有几种方法。 简单思路:设dp[i]dp[i]为字符串从第i位开始的拆解方法;仔细一想的话就会...

LA-3942 Remember the Word

题意:给出一个由S个不同的单词组成的字典和一个长字符串,把这个字符串分解成若干个单词的连接单词可以重复使用,有多少种方法?(PS 应该%20071027,白书写错了) 分析:dp + tri...

LA 3942 Remember the Word

已知一些单词,选择其中一些单词组成目的字符串,问共有多少种方法。其实初看到这道题,自然而然地可以想到动态规划中经典的硬币问题:例如,问1元,2元,5元,总共有多少种方法能组成20元?这里不过是把硬币换...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)