BZOJ1030 [JSOI2007]文本生成器[DP+AC自动机]
我学到现在才是初三学弟的水平。。哭
这里相当于求长度为$m$的,字符集$\{A...Z\}$的且不包含任一模式串的文本串个数。这是一个典型的AC自动机匹配计数问题。
设$f_{i,j}$表示在AC自动机上面走了$i$步在$j$点的方案数。
注意由于不能包含任一模式串,也就是说任意时刻都不能项后缀含有模式串的点上走,也就是fail树上所有以模式串结尾点为根的子树上的点。
这个可以在建立fail树的时候附带标记好。
于是转移的时候枚举字符集,下一步可以走向合法节点则转移之,否则不转移。边界$f_{0,0}=1$。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define dbg(x) cerr << #x << " = " << x <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int P=,N=+;
char s[+];
int tr[N][],nxt[N],ban[N],bin[N],tot,cnt;
int f[+][N];
int n,m,ans;
inline void Insert(){
int len=strlen(s+),x=;
for(register int i=,c=s[]-'A';i<=len;++i,c=s[i]-'A'){
if(!tr[x][c])tr[x][c]=++tot;
x=tr[x][c];
}
ban[x]=;
}
queue<int> q;
inline void Build(){
bin[cnt=]=;
for(register int i=;i<;++i)if(tr[][i])nxt[tr[][i]]=,q.push(tr[][i]);
while(!q.empty()){
int x=q.front();q.pop();
if(ban[nxt[x]])ban[x]=;
if(!ban[x])bin[++cnt]=x;
for(register int i=;i<;++i){
if(tr[x][i])nxt[tr[x][i]]=tr[nxt[x]][i],q.push(tr[x][i]);
else tr[x][i]=tr[nxt[x]][i];
}
}
}
inline void add(int&A,int B){A+=B;A>=P&&(A-=P);}
inline int fpow(int x,int p){int ret=;for(;p;p>>=,x=x*x%P)if(p&)ret=ret*x%P;return ret;}
inline void dp(){
f[][]=;
for(register int i=;i<m;++i)
for(register int j=;j<=cnt;++j)if(f[i][bin[j]])
for(register int k=;k<;++k)if(!ban[tr[bin[j]][k]])
add(f[i+][tr[bin[j]][k]],f[i][bin[j]]);
} int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
read(n),read(m);
for(register int i=;i<=n;++i)scanf("%s",s+),Insert();
Build();
dp();
for(register int i=;i<=cnt;++i)add(ans,f[m][bin[i]]);
printf("%d\n",(fpow(,m)-ans+P)%P);
return ;
}
这里使用AC自动机位置描述状态,是为了有效满足合法性。注意。
BZOJ1030 [JSOI2007]文本生成器[DP+AC自动机]的更多相关文章
- BZOJ1030 JSOI2007 文本生成器 【AC自动机】【DP】*
BZOJ1030 JSOI2007 文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现 ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机)(dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5254 Solved: 2172[Submit][Stat ...
- bzoj1030: [JSOI2007]文本生成器(AC自动机+DP)
第一次写这类题...懵 直接计算答案不好计算,所以补集转化求不合法的方案. 首先考虑朴素的DP,设$f(i, s)$表示前$i$个字符,字符串为$s$的方案数,且任意一个给定串都不存在$s$中. 我们 ...
- BZOJ1030 [JSOI2007]文本生成器(AC自动机)
做到了AC自动机的题目,复习了一下AC自动机,学习了黄学长代码,这个题呢,我们可以模拟在AC自动机上的操作,dp数组f[i][j]表示前i个字符,我们在AC自动机上处在j号节点的方案数. 我们可以计算 ...
- 2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)
2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP) https://www.luogu.com.cn/problem/P4052 题意: JSOI 交给队员 ZYX ...
- 【BZOJ1030】文本生成器(AC自动机,动态规划)
[BZOJ1030]文本生成器(AC自动机,动态规划) 题面 BZOJ 题解 超级简单良心送分题 很明显是所有状态-不合法状态 合法状态就是\(26^m\) 不合法状态做一个\(dp\)就好 #inc ...
- 【bzoj1030】: [JSOI2007]文本生成器 字符串-AC自动机-DP
[bzoj1030]: [JSOI2007]文本生成器 首先把匹配任意一个的个数的问题转化为总个数-没有一个匹配的个数 先构造AC自动机,然后枚举每一位的字母以及在自动机上的位置 f[i][j]为第i ...
- 【洛谷 P4052】 [JSOI2007]文本生成器(AC自动机,DP)
题目链接 AC自动机上dp第一题嗷. 如果直接求可读文本的数量,显然要容斥,不好搞. 于是考虑求不可读文本的数量,再用\(26^m\)减去其即可. 建出AC自动机,如果一个节点为单词结尾或其fail链 ...
- bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...
随机推荐
- java使用validator进行校验
不管是html页面表单提交的对象数据还是和第三方公司进行接口对接,都需要对接收到的数据进行校验(非空.长度.格式等等).如果使用if一个个进行校验(字段非常多),这是让人崩溃的过程.幸好jdk或hib ...
- 20190507-学习dubbo有感于梁飞
“作为一名程序员,BAT肯定是大多数人都想进的,仿佛是一种情愫,就像学生时代的我们对清华北大的向往感觉一样.Dubbo团队中,其中主要负责人就是梁飞了,梁飞的经历还是蛮励志的.梁飞,花名虚极, 200 ...
- ArrayList类的set()方法
ArrayList类的set()方法用于更新指定位置的内容,若内容是new出来的,则需要调用该set()方法:否则,不需要调用该set()方法,示例如下 User.java public class ...
- E.XKC's basketball team(The Preliminary Contest for ICPC Asia Xuzhou 2019)
https://nanti.jisuanke.com/t/41387 解: 离散化+线段树. #define IOS ios_base::sync_with_stdio(0); cin.tie(0); ...
- php 取post数据的三种方式
$_POST.$GLOBALS['HTTP_RAW_POST_DATA'].file_get_contents("php://input") 都有用来取post数据,用下来感觉大致 ...
- django进阶版1
目录 字段中choice参数 MTV与MVC模型 AJAX(*********) Ajax普通请求 Ajax传json格式化数据 Ajax传文件 序列化组件 Ajax+sweetalert 字段中ch ...
- pycharm虚拟环境的搭建
目录 优点 windows 安装 配置虚拟环境管理器工作目录 MacOS.Linux 安装 工作文件 配置 使用 pycharm使用 新建项目 添加环境 使用环境 优点 1.使不同应用开发环境相互独立 ...
- 怎样重置MySQL密码?
systemctl stop mysqld systemctl set-environment MYSQLD_OPTS="--skip-grant-tables" systemct ...
- C#中word文档转html
var path = Request.Url.Host + ":" + Request.Url.Port + list[i].AnnexPath; //html保存路径 strin ...
- 客户端相关知识学习(六)之deeplink技术
Deeplink应用描述 Deeplink,简单讲,就是你在手机上点击一个链接之后,可以直接链接到app内部的某个页面,而不是app正常打开时显示的首页.不似web,一个链接就可以直接打开web的内页 ...