题目大意:给定一个字符串和一个字符串集合,问从集合中选出若干个串组成给定母串的不同方案数。

题解:有些类似于背包问题。状态很好表示,为:\(dp[i]\) 表示母串前 i 个字符的不同方案数,因此,有状态转移方程为:$$dp[i]=\sum dp[j],s[j+1...i]=s_0,s_0\in set$$ ,可以发现若枚举 \(j < i\) 作为决策集合的话,时间复杂度将是 \(O(n^2)\) 的。优化:可以用 Trie 来直接进行匹配,具体操作如下:将每个集合中的串倒序插入 Trie 中,再对每个 i 进行倒序匹配,若匹配成功则尝试决策转移,时间复杂度为 \(O(n*depth)\),其中 depth 为集合中最长串的长度(小于100)。

代码如下

#include <bits/stdc++.h>
#define cls(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=4e5+10;
const int mod=20071027; int trie[maxn][26],tot=1;bool ed[maxn];
int kase,n,dp[maxn];
char s[maxn],s2[101]; void insert(int now,int idx){
if(!idx){ed[now]=1;return;}
int ch=s2[idx]-'a';
if(!trie[now][ch])trie[now][ch]=++tot;
now=trie[now][ch],insert(now,idx-1);
} void go(int now,int idx,int i){
if(ed[now])dp[i]=((long long)dp[i]+dp[idx])%mod;
if(!idx)return;
else if(!trie[now][s[idx]-'a'])return;
else go(trie[now][s[idx]-'a'],idx-1,i);
} void read_and_parse(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%s",s2+1),insert(1,strlen(s2+1));
} void solve(){
dp[0]=1;
for(int i=1;i<=strlen(s+1);i++)go(1,i,i);
printf("Case %d: %d\n",++kase,dp[strlen(s+1)]);
} void init(){
cls(trie,0),cls(ed,0),cls(dp,0),tot=1;
} int main(){
while(scanf("%s",s+1)!=EOF){
init();
read_and_parse();
solve();
}
return 0;
}

【UVA1401】Remember the Word Trie+dp的更多相关文章

  1. 【题解】HDU5845 Best Division (trie树)

    [题解]HDU5845 Best Division (trie树) 题意:给定你一个序列(三个参数来根),然后请你划分子段.在每段子段长度小于等于\(L\)且子段的异或和\(\le x\)的情况下最大 ...

  2. 【BZOJ4260】Codechef REBXOR (Trie树)

    [BZOJ4260]Codechef REBXOR (Trie树) 题面 BZOJ 题解 两眼题.第一眼不会做,第二眼好简单... 前缀异或和一下,拿\(Trie\)树维护求一个在这个端点以左的最大值 ...

  3. 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)

    [题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...

  4. 【BZOJ1212】[HNOI2004]L语言 Trie树

    [BZOJ1212][HNOI2004]L语言 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构 ...

  5. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  6. 【string】KMP, 扩展KMP,trie,SA,ACAM,SAM,最小表示法

    [KMP] 学习KMP,我们先要知道KMP是干什么的. KMP?KMPLAYER?看**? 正如AC自动机,KMP为什么要叫KMP是因为它是由三个人共同研究得到的- .- 啊跑题了. KMP就是给出一 ...

  7. 【CF506E】Mr. Kitayuta's Gift dp转有限状态自动机+矩阵乘法

    [CF506E]Mr. Kitayuta's Gift 题意:给你一个字符串s,你需要在s中插入n个字符(小写字母),每个字符可以被插在任意位置.问可以得到多少种本质不同的字符串,使得这个串是回文的. ...

  8. 【BZOJ1187】[HNOI2007]神奇游乐园 插头DP

    [BZOJ1187][HNOI2007]神奇游乐园 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细 ...

  9. UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP

    #17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:// ...

随机推荐

  1. JavaEE笔记(十)

    #Spring 为了配置bean对象和维护bean对象之间关系的一个容器框架 #三种注入方法 1 Setter注入2 构造参数注入3 注解注入(原理同1) #自动装配(autowire) 模式 说明 ...

  2. 【第十课】Tomcat入门

    目录 1.Tomcat介绍 2.Tomcat安装部署和配置 (1)tomcat下载和解压 (2)jdk环境变量配置 (3)设置tomcat以普通用户启动 (4)查看tomcat的配置 (5)tomca ...

  3. TMS320VC5509的MCBSP配置成SPI模式通信

    1. 首先是把MCBSP的配置 其次是时钟停止模式的配置,关闭大同小异 SPI有4中模式,怎么根据上面的寄存器选择哪种模式?下面展示了其中两种,CLKXP=1的时候有另外两种,暂时不整出来了 2. 代 ...

  4. 在服务器运行一个jar包,不用时终止它

    1.打成jar包后,输入命令 nohup java -jar floodlight.jar >log.txt >& &//nohup 不生成 nohup.out的方法noh ...

  5. [CF1019C]Sergey's problem[构造]

    题意 找出一个集合 \(Q\),使得其中的点两两之间没有连边,且集合中的点可以走不超过两步到达其他所有不在集合中的点.输出任意一组解. \(n\leq 10^6\) 分析 考虑构造,先从 \(1\) ...

  6. 你应该知道Go语言的几个优势

    要说起GO语言的优势,我们就得从GO语言的历史讲起了-- 本文由腾讯技术工程官方号发表在腾讯云+社区 2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Grie ...

  7. Boyer and Moore Fast majority vote algorithm(快速选举算法)

    问题来来自于leetcode上的一道题目,https://leetcode.com/problems/majority-element/,大意是是找出一个数组中,出现次数超过一个半的数字,要求是O(n ...

  8. java后台面试知识点总结

    本文主要记录在准备面试过程中遇到的一些基本知识点(持续更新) 一.Java基础知识 1.抽象类和接口的区别 接口和抽象类中都可以定义变量,但是接口中定义的必须是公共的.静态的.Final的,抽象类中的 ...

  9. 504. Base 7

    Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "202&q ...

  10. 现已告别五险一金?迎来社保商保时代保险INSURAUNCE

    现已告别五险一金?迎来社保商保时代保险INSURAUNCE 经济工作会议提出,中国要降低社会保险费,研究精简归并"五险一金",可以说是为社保变革指明了大方向.未来,生育保险将与基本 ...