UvaLive3942(Trie + dp)
查了半天数组越界的RE,才发现自己把ch数组放结构体里是过大的……放全局就A了。
类似区间的dp比较显然,只是用trie树做了优化,使得可以在trie树里一边走一边往上加dp值,不必枚举以前的每个位置了,省去了很多不必要状态。复杂度就O(n*Trie)。
终于比刘汝佳的代码优雅了(弥天大雾)
const int maxn = 3e5 + ;
const int maxnode = * + ;
const int mod = ; int ch[maxnode][]; struct Trie {
int sz;
bool IsWord[maxnode]; Trie() {
sz = ;
init(ch[], );
} void insert(char *t) {
int len = strlen(t), u = ;
for (int i = ; i < len; ++i) {
if (!ch[u][t[i] - 'a']) {
init(ch[sz], );
IsWord[sz] = false;
ch[u][t[i] - 'a'] = sz++;
}
u = ch[u][t[i] - 'a'];
}
IsWord[u] = true;
} int find(int pos, char *str, int *dp) {
int ret = , u = ;
for (int i = pos; str[i]; ++i) {
if (!ch[u][str[i] - 'a']) return ret;
u = ch[u][str[i] - 'a'];
if (IsWord[u]) ret = ((ll)ret + dp[i + ]) % mod;
}
return ret;
}
}; char str[maxn], t[];
int S, L, dp[maxn], kase; int main() {
while (~scanf("%s", str)) {
Trie T;
for (scanf("%d", &S); S; S--) {
scanf("%s", t);
T.insert(t);
}
L = strlen(str);
dp[L] = ;
for (int i = L - ; ~i; --i) {
dp[i] = T.find(i, str, dp);
}
printf("Case %d: %d\n", ++kase, dp[]);
}
return ;
}
UvaLive3942(Trie + dp)的更多相关文章
- UVA 3942 Remember the Word (Trie+DP)题解
思路: 大白里Trie的例题,开篇就是一句很容易推出....orz 这里需要Trie+DP解决. 仔细想想我们可以得到dp[i]=sum(dp[i+len[x]]). 这里需要解释一下:dp是从最后一 ...
- UVALive - 3942 Remember the Word (Trie + DP)
题意: 给定一篇长度为L的小写字母文章, 然后给定n个字母, 问有多少种方法用这些字母组成文章. 思路: 用dp[i]来表达[i , L]的方法数, 那么dp[i] 就可以从dp[len(x) + i ...
- UVA - 1401 Remember the Word(trie+dp)
1.给一个串,在给一个单词集合,求用这个单词集合组成串,共有多少种组法. 例如:串 abcd, 单词集合 a, b, cd, ab 组合方式:2种: a,b,cd ab,cd 2.把单词集合建立字典树 ...
- ACdreamOJ 1154 Lowbit Sum (数字dp)
ACdreamOJ 1154 Lowbit Sum (数位dp) ACM 题目地址:pid=1154" target="_blank" style="color ...
- 【Luogu3732】[HAOI2017]供给侧改革(Trie树)
[Luogu3732][HAOI2017]供给侧改革(Trie树) 题面 洛谷 给定一个纯随机的\(01\)串,每次询问\([L,R]\)之间所有后缀两两之间的\(LCP\)的最大值. 题解 一个暴力 ...
- 「SDOI2016」储能表(数位dp)
「SDOI2016」储能表(数位dp) 神仙数位 \(dp\) 系列 可能我做题做得少 \(QAQ\) \(f[i][0/1][0/1][0/1]\) 表示第 \(i\) 位 \(n\) 是否到达上界 ...
- 【HDU1693】Eat the Trees(插头dp)
[HDU1693]Eat the Trees(插头dp) 题面 HDU Vjudge 大概就是网格图上有些点不能走,现在要找到若干条不相交的哈密顿回路使得所有格子都恰好被走过一遍. 题解 这题的弱化版 ...
- 【BZOJ1814】Ural 1519 Formula 1 (插头dp)
[BZOJ1814]Ural 1519 Formula 1 (插头dp) 题面 BZOJ Vjudge 题解 戳这里 上面那个链接里面写的非常好啦. 然后说几个点吧. 首先是关于为什么只需要考虑三进制 ...
- 【BZOJ4712】洪水(动态dp)
[BZOJ4712]洪水(动态dp) 题面 BZOJ 然而是权限题QwQ,所以粘过来算了. Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开 ...
随机推荐
- Xammp修改端口
How can I get XAMPP working on port 80 under Windows 10? By default, Windows 10 starts Microsoft IIS ...
- 【献给CWNU的师弟】Web篇
2014年10月8日 献给CWNU的师弟
- LeetCode(67)题解: Add Binary
https://leetcode.com/problems/add-binary/ 题目: Given two binary strings, return their sum (also a bin ...
- HashMap随机取值和迭代器取值的对比
一共四中方法,前两种是迭代器取值,后两种是随机取值,循环了5000万次,时间分别为:迭代器读取的速度大约是随机读取的速度的1.5倍,数据量越大,差距越明显. 另外,插入是读取的100倍左右的时间(这个 ...
- Hibernate中的merge使用详情解说
merge的作用是:新new一个对象,如果该对象设置了ID,则这个对象就当作游离态处理: 当ID在数据库中不能找到时,用up ...
- linq to xml There are multiple root elements.
添加xml结点的时候 var temp2 = temp1.Element("staticContent"); if (temp2 != null) { string str = & ...
- 解决VMware安装Ubuntu的过程中窗口过小无法看到【下一步】按钮的问题
只要按住ALT键向上拖动窗口
- Redis使用基本套路
Redis的数据,通常都是来自于数据库. 存入Redis当中,可以快速的查询.不用每次都关联查询,然后其他处理什么的. 通常可以把一些,不经常变的数据存储其中. 避免数据变动,而Redis缓存数据不变 ...
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用
目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,N ...
- 识别String类型变量的问题
碰到了android无法识别string的问题 Cursor cursor = db.query(true, "user", new String[]{"id" ...