LA 3942 - Remember the Word (字典树 + dp)
题目大意:
给定一个字符串和给定一个单词集合。问从给定单词集合中选取单词,有多少种选取方法刚好拼接成字符串。
例如:
abcd
4
a
b
cd
ab
有两种
a-b-cd
ab-cd
这两种情况
解题思路:
因为给定的字符串的长度是3*10^5所以暴力就不能解决问题了。
dp[j + 1] = dp[j + 1] + dp[i];dp[j + 1]表示从S[0~j]有多少中组成方法 ,用公式的条件是S[i~j]是单词集合里的元素
有了上面的dp,时间减少了,但是每次查找单词如果枚举每个单词,则时间复杂度3*10^5*4*10^3*10^2。我们用字典树
存储所有单词。每次查找单词时间最坏是O(10^2)。
所以总时间复杂度是O(n*10^2)。
参开资料《算法入门经典训练之南》刘汝佳 P209
AC代码:
#include<cstdio>
#include<cstring> #define STR 300000 + 10//模板串的长度
#define SIZE 400000 //字典树的节点数
#define LETTER 26 //字符个数
#define S 100+10//单词的长度
#define MOD 20071027 int size, trie[SIZE][LETTER];//size字典的节点数 trie字典树的节点
bool val[SIZE];//记录字典树的节点是否为单词
char strp[STR];//模板单词
int dp[STR];//dp[i]表示从0~i有多少种组成模板单词 void init(int x){//初始化节点
val[x] = ;
memset(trie[x], , sizeof(trie[x]));
} int idx(char c){
return c - 'a';
} void insert(char str[]){
int u = ;
for(int i = ; str[i]; ++i){
int num = idx(str[i]);
if(!trie[u][num]){//儿子为空
init(size);//扩充节点
trie[u][num] = size++;
}
u = trie[u][num];//指向下一个节点
}
val[u] = true;//当前节点是一个单词的末尾
} void dynamic(int cs){
memset(dp, , sizeof(dp));
dp[] = ;
int i;
for(i = ; strp[i]; ++i){
int u = ;
for(int j = i; strp[j]; ++j){
int num = idx(strp[j]);
if(!trie[u][num]){
break;
}
u = trie[u][num];
if(val[u]){
dp[j + ] = (dp[j + ] + dp[i]) % MOD;//dp公式
}
}
}
printf("Case %d: %d\n", cs, dp[i]);
} int main(){
int s;
char str[S];
for(int cs = ; ~scanf("%s", strp); ++cs){ init();//初始化节字典树
size = ; scanf("%d", &s);
while(s--){
scanf("%s", str);
insert(str);
}
dynamic(cs);
}
return ;
}
LA 3942 - Remember the Word (字典树 + dp)的更多相关文章
- LA 3942 - Remember the Word 字典树+DP
看题传送门:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...
- UVALive 3942 Remember the Word 字典树+dp
/** 题目:UVALive 3942 Remember the Word 链接:https://vjudge.net/problem/UVALive-3942 题意:给定一个字符串(长度最多3e5) ...
- LA 3942 Remember the Word(前缀树&树上DP)
3942 - Remember the Word Neal is very curious about combinatorial problems, and now here comes a pro ...
- Manthan, Codefest 16 C. Spy Syndrome 2 字典树 + dp
C. Spy Syndrome 2 题目连接: http://www.codeforces.com/contest/633/problem/C Description After observing ...
- Trie + DP LA 3942 Remember the Word
题目传送门 题意:(训练指南P209) 问长字符串S能由短单词组成的方案数有多少个 分析:书上的做法.递推法,从后往前,保存后缀S[i, len-1]的方案数,那么dp[i] = sum (dp[i+ ...
- UVA1401 Remember the Word 字典树维护dp
题目链接:https://vjudge.net/problem/UVA-1401 题目: Neal is very curious about combinatorial problems, and ...
- UVALive 3942 字典树+dp
其实主要是想学一下字典树的写法,但这个题目又涉及到了DP:这个题目要求某些单词组成一个长子串的各种组合总数,数据量大,单纯枚举复杂度高,首先肯定是要把各个单词给建成字典树,但是之后该怎么推一时没想到. ...
- CF456D A Lot of Games (字典树+DP)
D - A Lot of Games CF#260 Div2 D题 CF#260 Div1 B题 Codeforces Round #260 CF455B D. A Lot of Games time ...
- HDU5715 XOR 游戏 二分+字典树+dp
当时Astar复赛的时候只做出1题,赛后补题(很长时间后才补,懒真是要命),发现这是第二简单的 分析: 这个题,可以每次二分区间的最小异或和 进行check的时候用dp进行判断,dp[i][j]代表前 ...
随机推荐
- CodeForces 444C 分块
题目链接:http://codeforces.com/problemset/problem/444/C 题意:给定一个长度为n的序列a[].起初a[i]=i,然后还有一个色度的序列b[],起初b[i] ...
- 树链剖分+线段树 BZOJ 1036 [ZJOI2008]树的统计Count
题目链接 题意: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节 ...
- 存储过程执行失败与sql668n
某日监控报存储过程执行失败,查看返回码为sql668n [db2inst1@limt bin]$ db2 ? sql668n SQL0668N Operation not allowed for re ...
- 星外Xday提权
在星外不是安全模式的时候 但是又没有执行目录 有时候远程调用也不行对吧 winrar 有执行权限的时候C:\windows\IIS Temporary Compressed Files\ 这个目录有 ...
- ccf模板生成
问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的.例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 而当用户为 Jerr ...
- EMF学习,为了实现可扩展可自定义的模型验证 - 各种实现方法学习
自: http://blog.csdn.net/javaman_chen/article/details/6057033 http://www.ibm.com/developerworks/cn/op ...
- 获取打开指定Action的所有应用包名
获取打开指定功能的所有应用:发消息,分享等等. 如打开网页,下面代码即可查看所有的浏览器 //查找所有浏览器 private void queryPackage() { PackageManager ...
- 模拟jquery的$()选择器的实现
<html> <head> </head> <body> <div id="div1">div1</div> ...
- C和C++混合编程中的extern "C" {}
引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: 1 2 3 4 5 6 7 8 9 #ifdef __cplusplus extern "C" { #endif ...
- 谈一谈php://filter的妙用
php://filter是PHP中独有的协议,利用这个协议可以创造很多"妙用",本文说几个有意思的点,剩下的大家自己下去体会.本来本文的思路我上半年就准备拿来做XDCTF2016的 ...