【洛谷 P4052】 [JSOI2007]文本生成器(AC自动机,DP)
AC自动机上dp第一题嗷。
如果直接求可读文本的数量,显然要容斥,不好搞。
于是考虑求不可读文本的数量,再用\(26^m\)减去其即可。
建出AC自动机,如果一个节点为单词结尾或其fail链中有节点为单词结尾,那么这个点就不能走,这个显然可以在bfs的时候顺便求出来。
然后就是大家熟知的方案数dp了,\(f[n][m]\)表示走到节点\(n\)用\(m\)步的方案数,转移就不说了。
最后答案就是\(26^m-\sum_{i=1}^mf[i][m]\)
#include <cstdio>
#include <queue>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAXN = 60010;
const int MAXM = 110;
const int MOD = 10007;
struct Node{
int fail, next[26];
}AC[MAXN];
int n, u, cnt, m;
queue <int> q;
int ban[MAXN], f[MAXN][MAXM];
char a[MAXN];
void insert(){
int len = strlen(a + 1), w;
u = 0;
for(int i = 1; i <= len; ++i){
w = a[i] - 'A';
if(!AC[u].next[w])
AC[u].next[w] = ++cnt;
u = AC[u].next[w];
}
ban[u] = 1;
}
void BuildFail(){
u = 0;
for(int i = 0; i < 26; ++i)
if(AC[u].next[i])
q.push(AC[u].next[i]);
while(q.size()){
u = q.front(); q.pop();
ban[u] |= ban[AC[u].fail];
for(int i = 0; i < 26; ++i)
if(AC[u].next[i]){
q.push(AC[u].next[i]);
AC[AC[u].next[i]].fail = AC[AC[u].fail].next[i];
}
else
AC[u].next[i] = AC[AC[u].fail].next[i];
}
}
int fast_pow(int n, int k){
int ans = 1;
while(k){
if(k & 1) ans = ans * n % MOD;
n = n * n % MOD;
k >>= 1;
}
return ans;
}
int ans;
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
scanf("%s", a + 1);
insert();
}
BuildFail();
f[0][0] = 1;
for(int i = 1; i <= m; ++i)
for(int j = 0; j <= cnt; ++j)
for(int k = 0; k < 26; ++k)
if(!ban[AC[j].next[k]])
f[AC[j].next[k]][i] = (f[AC[j].next[k]][i] + f[j][i - 1]) % MOD;
ans = fast_pow(26, m);
for(int i = 0; i <= cnt; ++i)
ans = (ans - f[i][m] + MOD) % MOD;
printf("%d\n", ans);
return 0;
}
【洛谷 P4052】 [JSOI2007]文本生成器(AC自动机,DP)的更多相关文章
- 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp
正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...
- [JSOI2007]文本生成器 --- AC自动机 + DP
[JSOI2007]文本生成器 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机 ...
- BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3953 Solved: 1614[Submit][Stat ...
- 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- 洛谷P4052 [JSOI2007]文本生成器(AC自动机)
传送门 好像这题的确只能用AC自动机做了……Aufun大佬太强啦 正着难我们反着做,用总共单词个数减去没有一个单词都不包含的 然后考虑怎么处理一个单词都不包含的,就是跑不到单词的结尾节点 定义$f[i ...
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- BZOJ1030[JSOI2007]文本生成器——AC自动机+DP
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- 1030: [JSOI2007]文本生成器 ac自动机+dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...
随机推荐
- Multi-Agent Reinforcement Learning Based Frame Sampling for Effective Untrimmed Video Recognition
Multi-Agent Reinforcement Learning Based Frame Sampling for Effective Untrimmed Video Recognition IC ...
- 002 vue-resource
一:概述 1.说明 https://github.com/pagekit/vue-resource 2.使用方法 Vue.http.get('/someUrl', [config]).then(suc ...
- 关于idea跳过错误编译的理解, 跳过报错的代码启动项目去debug测试其他正常的代码
关于idea跳过错误编译的理解 2018年07月13日 19:06:32 weixin_39669410 阅读数 1296 其实idea使用eclipse编译器可以实现跳过报错的代码启动项目去de ...
- RequestUtil 获取网址页面信息
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...
- Java之Java程序的基本结构
Java的基本结构是 /** * 可以用来自动创建文档的注释 */ public class Hello { public static void main(String[] args) { // 向 ...
- 使用clion+cmake+vcpkg的开发现代的c++跨平台程序
使用clion+cmake+vcpkg的开发现代的c++跨平台程序 使用c++开发跨平台的程序 背景 在开发过程中,使用c++作为开发语言,通常被认为是痛苦的,啰嗦的,超长开发时间的.最近几年有各种各 ...
- 基于 appium 的 UI 自动化测试
其中主要的目录和文件为: /MPTestCases ----------- 存放测试用例 /errorScreenShot ------------ 用例执行失败生成的错误截图 startTest.p ...
- ubuntu18.04LTS服务器用vituralenv安装和配置pytorch和tensorflow
============tensorflow================= $ python3 -m venv tf14====输入例子====# $ vim ~/.bashrc #(添加如下行, ...
- IDEA 自定义代码模板
IDEA 自定义代码模板操作步骤:
- 备份数据库中的某个表的数据报错Statement violates GTID consistency
1.错误描述 执行CREATE TABLE tig_pairs_20190521 AS SELECT *FROM tig_pairs报错: 1 queries executed, 0 success, ...