https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1943

题目大意:

  给定一个字符串和给定一个单词集合。问从给定单词集合中选取单词,有多少种选取方法刚好拼接成字符串。

例如:

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)的更多相关文章

  1. LA 3942 - Remember the Word 字典树+DP

    看题传送门:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  2. UVALive 3942 Remember the Word 字典树+dp

    /** 题目:UVALive 3942 Remember the Word 链接:https://vjudge.net/problem/UVALive-3942 题意:给定一个字符串(长度最多3e5) ...

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

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

  4. Manthan, Codefest 16 C. Spy Syndrome 2 字典树 + dp

    C. Spy Syndrome 2 题目连接: http://www.codeforces.com/contest/633/problem/C Description After observing ...

  5. Trie + DP LA 3942 Remember the Word

    题目传送门 题意:(训练指南P209) 问长字符串S能由短单词组成的方案数有多少个 分析:书上的做法.递推法,从后往前,保存后缀S[i, len-1]的方案数,那么dp[i] = sum (dp[i+ ...

  6. UVA1401 Remember the Word 字典树维护dp

    题目链接:https://vjudge.net/problem/UVA-1401 题目: Neal is very curious about combinatorial problems, and ...

  7. UVALive 3942 字典树+dp

    其实主要是想学一下字典树的写法,但这个题目又涉及到了DP:这个题目要求某些单词组成一个长子串的各种组合总数,数据量大,单纯枚举复杂度高,首先肯定是要把各个单词给建成字典树,但是之后该怎么推一时没想到. ...

  8. 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 ...

  9. HDU5715 XOR 游戏 二分+字典树+dp

    当时Astar复赛的时候只做出1题,赛后补题(很长时间后才补,懒真是要命),发现这是第二简单的 分析: 这个题,可以每次二分区间的最小异或和 进行check的时候用dp进行判断,dp[i][j]代表前 ...

随机推荐

  1. javascript将object转string字符串

    var jsonData = {a:1,b:2}; function obj2string(o) { var r = []; if (typeof o == "string") { ...

  2. python 自带的ide 不能保存文件

    初学python 用shell写的代码结果不能保存,经查询,原因有人说是因为文件里有中文, import random secret =random.randint(1,100) guess=0 tr ...

  3. ARM大学计划全球经理到访华清远见,深入交流教育合作

    来源:华清远见嵌入式学院 10月20日,ARM大学计划全球经理Khaled Benkrid,高级内容主编洪川博士在ARM大学计划亚太经理陈炜博士的陪同下到访华清远见,就最新嵌入式技术.ARM处理器在教 ...

  4. jQuery实现全选效果【转】

    这是一段用jquery实现全选的代码,主要思路如下: 1.所有的复选框都有单击事件,所有效果都是在单击事件下实现的 2.全选复选框所实现的功能与其他复选选项实现的功能不同,所有在单击事件内做一个判断, ...

  5. 初学者对于MVC架构模式学习与理解

    理解MVC的工作原理,明白一个网页是如何显示出来的 之前一直盲目的在慕课上看视频,脑袋里想着要理解mvc,看了mvc相关的视频,看完之后就觉得空白白的,M,V,C各代表什么我知道,但是这个究竟有啥意思 ...

  6. java 输入年月,获取日历表

    /* 做日历作业: 输入一个时间如: 2016-11 就显示2016年11月的日历显示 */ import java.util.*; class calendar { public static vo ...

  7. Mysql 中的事件//定时任务

    什么是事件 一组SQL集,用来执行定时任务,跟触发器很像,都是被动执行的,事件是因为时间到了触发执行,而触发器是因为某件事件(增删改)触发执行: 开启事件 查看是否开启: show variables ...

  8. javascript平时小例子⑦(鼠标跟随的div)

    <!doctype html><html> <head> <meta charset="utf-8"> <title>无 ...

  9. thinkphp1

    命名空间 含义:从广义上来说,命名空间是一种封装事物的方法. 用途:用来解决命名冲突 namespace xxx\xxx; 使用: use xxx\xx\yy; new\xx\xx\yy; // 单一 ...

  10. 【emWin】例程九:绘制流位图

    实验指导书及代码包下载: 链接:http://pan.baidu.com/s/1kVDIWIF 密码:9jbo 实验现象: