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

题意:一个长字符串和多个短字符串,求短字符串有多少种方式组成长字符串。

状态转移方程: dp[i] = sum(d[i + len(x)])  (x是s[i...L]的前缀)

对于每个i,如果直接暴力寻找s[i...L]的前缀,复杂度为O(nm) (n为短字符串的个数,m为短字符串的长度),肯定会超时。

既然是求前缀,那么可以使用前缀树(字典树)来解决此问题。用字典树寻找前缀的复杂度为O(m)。

#include <cstdio>
#include <iostream>
#include <cstring>
#define maxn 400100
#define maxm 300010
#define mod 20071027
#define sigma_size 26
using namespace std;char str[maxm], tstr[110];
int dp[maxm], ch[maxn][sigma_size], val[maxn], sz;struct Trie
{int get_id(char c){return c - 'a';}void insert(char* str, int v){int u = 0, len = (int)strlen(str);for (int i = 0; i < len; ++i){int id = get_id(str[i]);if (!ch[u][id]){memset( ch[sz], 0, sizeof(ch[sz]));val[sz] = 0;ch[u][id] = sz++;}u = ch[u][id];}val[u] = v;}int query(char* str, int start){int u = 0, result = 0, len = (int)strlen(str), next;for (int i = 0; i < len; ++i){int id = get_id(str[i]);next = ch[u][id];if (next){if (val[next])result = (result + dp[i + start + 1])%mod;}elsebreak;u = next;}return result;}
};void init();int main(void)
{int ca = 1, n;while (scanf("%s", str) != EOF){init();int len = (int)strlen(str);scanf("%d", &n);Trie trie = Trie();while (n--){scanf("%s", tstr);trie.insert( tstr, 1);}dp[len] = 1;for (int i = len - 1; i >= 0; i--){dp[i] = trie.query( str + i, i);}printf("Case %d: %d\n", ca++, dp[0]);}return 0;
}void init()
{sz = 1;memset( dp, 0, sizeof(dp));memset( ch[0], 0, sizeof(ch[0]));memset( val, 0, sizeof(val));
}

转载于:https://www.cnblogs.com/chuninsane/p/4923533.html

UVALive 3942 Remember the Word(字典树+DP)相关推荐

  1. CF633C Spy Syndrome 2(字典树+dp)

    CF633C Spy Syndrome 2 原题链接 说是 dpdpdp 但是感觉说是一个记忆化也可以.我们定义一个 dpdpdp 数组,其 dp[i]dp[i]dp[i] 含义为将加密串前 iii ...

  2. 词韵(字典树+DP)

    词韵 时间限制: 2 Sec  内存限制: 128 MB                                                                         ...

  3. upc 6360 词韵(字典树 + dp)

    6360: 词韵 时间限制: 2 Sec  内存限制: 128 MB 题目描述 Adrian 很喜欢诗歌中的韵.他认为,两个单词押韵当且仅当它们的最长公共 后缀的长度至少是其中较长单词的长度减一.也就 ...

  4. Trie(字典树)解析及其在编程竞赛中的典型应用举例

    摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用 ...

  5. 【CODE】Unique Paths Word Search (DFS dp 字典树)

    目录 62. Unique Paths 63. Unique Paths II 980. Unique Paths III 79. Word Search 212. Word Search II 字典 ...

  6. 经典算法题:字典树、并查集、单调栈、二分、带标记函数dp、树、全排列、字符串问题等常用算法

    0. Tips 1. 位运算 如何枚举一个二进制状态数字k的子集, 方法就是针对中的二进制为1的位开始进行减法,判断数字k的二进制子集, 像枚举(2^k-1) ~ 0一样枚举其子集: int sub ...

  7. 词韵 (字典树+树形DP)

    6360: 词韵 时间限制: 2 Sec  内存限制: 128 MB 提交: 136  解决: 19 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Adrian 很喜欢诗歌中的韵. ...

  8. 6360: 词韵(字典树,DP)

    6360: 词韵 时间限制: 2 Sec  内存限制: 128 MB 提交: 171  解决: 31 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Adrian 很喜欢诗歌中的韵. ...

  9. C++解题报告——Rima(字典树+树形DP)

    题目描述 Adrian对单词押韵很感兴趣.如果两个单词的最长公共后缀的长度与两个单词中较长那个的长度一样,或者等于较长单词的长度减一,则这两个单词押韵.换句话说,如果A,B的最长公共后缀LCS(A,B ...

最新文章

  1. nginx limit_rate突然限速失败
  2. mysql 表单属性_php表单常用属性有什么?
  3. java 读取 excel poi_Java中读取Excel功能实现_POI
  4. 生产服务器怎么dmp堆栈信息,如何根据程序崩溃时的DMP文件使用WinDbg查找调用堆栈...
  5. mdb 查询过于复杂_【律联云知产课堂】南京商标查询主要从哪些方面判断一个商标是否适合注册?...
  6. ConcurrentModificationException的情况
  7. 22、在有序数组中插入一个数值,数组仍然有序——数组
  8. 通过Javascript Facebook API获取Facebook用户信息,以及当前用户的好
  9. 20个编写现代 CSS 代码的建议
  10. redis 中 epoll 模型 ~ 霓裳
  11. 计算机格式化的作用,怎样把电脑格式化 电脑格式化方法【图文】
  12. SSRF深度解析Gopher协议
  13. 输入某年某月某日java_java输入某年某月某日
  14. 创业者的诗,远方和功不唐捐
  15. Android侧滑返回分析和实现(不高仿微信),flutter项目实战
  16. 自问自答学ArrayList,看这篇就够了,详解问答
  17. 洛谷P4417 [COCI2006-2007#2] STOL
  18. 小红书去水印代码_小红书无水印图片,无水印视频解析下载,小红书视频图片去水印代码实现...
  19. PHP鲜花销售管理系统毕业设计
  20. Java将project设置为Maven项目,并配置

热门文章

  1. No module named pip
  2. proxy error: could not proxy request解决方案
  3. 关于Expdp/Impdp 并行导入导出详细测试结果和并行参数的正确理解!!
  4. 远程桌面无法复制文本时解决办法
  5. 大姐,你是不是得了尿频?
  6. java-StringBuffer构造方法
  7. ctrl shift o失效
  8. java 枚举类型 构造函数及用法
  9. SQL之inner join/left join/right join
  10. 隐私设置错误您的连接不是私密连接_用小米手机的,赶紧将这些保护个人隐私的功能设置起来,安全好用...