BZOJ1030——文本生成器
给你若干给字符串,再给你一个m,问长度是m的字符串中包含给定字符串的数量mod 10007是多少
这个拿过来啥思路也没有,后来还是看了题解,才知道,原来,原来。。。。那个带fail的Trie还可以搞别的
网上的大多数都是26^m-补集做的,麻烦啊,网上有一个非洲猴的blog写的挺好的
设f[i][j][k]表示什么呢,表示i:0..1 j:0..m k:0...size
表示i状态,匹配到j,在Trie上是k的数量
f[i | val[next[c]]][j + 1][next[c]] += f[i][j][k];对就是这样
我已经把next[c] == NULL的都变成fail了,
提醒按照lrj的白书学的AC自动机的同学们,那个last数组在匹配的所有时候都要循环枚举
提醒我自己当k等于0是不是这个位置是无,而是一个未匹配的点,因为计算last和dp时用last耗时代码量费啊
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
struct AC{
int ch[100010][30];
int val[100010];
char s[100010];
int f[100010];
int last[100010];
int g[2][200][10010];
int size;
int len;
inline int num(char x){
return x - 'A';
}
inline void init(){
memset(ch, 0, sizeof(ch));
memset(val, 0, sizeof(val));
size = 0;
return;
}
inline void insert(){
int u = 0;
for(int i = 0; i < len; i ++){
int c = num(s[i]);
if(!ch[u][c]){
ch[u][c] = ++ size;
}
u = ch[u][c];
}
val[u] = 1;
return;
}
inline void getfail(){
queue<int> Q;
for(int i = 0; i < 26; i ++) {
if(ch[0][i]) {
Q.push(ch[0][i]);
}
}
while(!Q.empty()){
int r = Q.front(); Q.pop();
for(int i = 0; i < 26; i ++){
int u = ch[r][i];
if(!u){
ch[r][i] = ch[f[r]][i];
continue;
}
Q.push(u);
int v = f[r];
while(v && !ch[v][i]) v = f[v];
f[u] = ch[v][i];
}
}
return;
}
inline int dp(int m){
for(int i = 0; i <= size; i ++){
if(!val[i]){
int j = f[i];
while(j){
if(val[j] == 1){
val[i] = 1;
break;
}
j = f[j];
}
}
}
g[0][0][0] = 1;
for(int i = 0; i <= 1; i ++){
for(int j = 0; j < m; j ++){
for(int k = 0; k <= size; k ++){
for(int c = 0; c < 26; c ++){
g[i | val[ch[k][c]]][j + 1][ch[k][c]] += g[i][j][k];
g[i | val[ch[k][c]]][j + 1][ch[k][c]] %= 10007;
}
}
}
}
int ret = 0;
for(int k = 0; k <= size; k ++) {
ret += g[1][m][k];
ret %= 10007;
}
return ret;
}
} wt;
int main(){
int N, M;
scanf("%d%d", &N, &M);
wt.init();
for(int i = 1; i <= N; i ++){
scanf("%s", wt.s);
wt.len = strlen(wt.s);
//if(wt.len > M) continue;
wt.insert();
}
wt.getfail();
printf("%d\n", wt.dp(M));
return 0;
}
BZOJ1030——文本生成器的更多相关文章
- bzoj1030 文本生成器(AC自动机+dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4777 Solved: 1986[Submit][Stat ...
- bzoj1030 文本生成器
题目链接 题意 给出\(n\)个字符串,要构造一个长度为\(m\)的字符串\(S\),使得给出的\(n\)个字符串中至少有一个是\(S\)的子串.问方案数. 思路 \(AC\)自动机+\(DP\) 考 ...
- 【BZOJ1030】文本生成器(AC自动机,动态规划)
[BZOJ1030]文本生成器(AC自动机,动态规划) 题面 BZOJ 题解 超级简单良心送分题 很明显是所有状态-不合法状态 合法状态就是\(26^m\) 不合法状态做一个\(dp\)就好 #inc ...
- 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...
- BZOJ1030 JSOI2007 文本生成器 【AC自动机】【DP】*
BZOJ1030 JSOI2007 文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现 ...
- 【bzoj1030】: [JSOI2007]文本生成器 字符串-AC自动机-DP
[bzoj1030]: [JSOI2007]文本生成器 首先把匹配任意一个的个数的问题转化为总个数-没有一个匹配的个数 先构造AC自动机,然后枚举每一位的字母以及在自动机上的位置 f[i][j]为第i ...
- 【BZOJ-1030】文本生成器 AC自动机 + DP
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3253 Solved: 1330[Submit][Stat ...
- bzoj1030 [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2654 Solved: 1100[Submit][Stat ...
- C++之路进阶——bzoj1030(文本生成器)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...
随机推荐
- mysql php query steps
1.mysql connect $db=new mysqli ('localhost','database','user','password'); 2. query $query=select id ...
- JS-DOM 综合练习-动态添加删除班级成绩表
费了2个小时,才把原理弄懂,把问题逐个解决,当你发现你最后栽的那个点,是一个小石头拌的你,你起来是该哭还是该笑呢?只怪自己习武不精吧. 虽然问题都解决了,但是还有一个余留的问题就是鼠标经过input时 ...
- Tomcat 的 ErrorPage 实现原理分析
使用Tomcat,一定见到过404,500的时候,见到过Tomcat提供的错误页面,例如请求的资源找不到的时候,响应状态码为404,这个时候的错误页面是这样的: 这些错误页面是 如何生成及定位展示的 ...
- Windows XP SP3 Professional 微软(MSDN)官方原版系统
Windows XP SP3 Professional 微软(MSDN)官方原版系统 Windows XP(版本号:5.1,开发代号:Whistler)是微软公司推出供个人电脑使用的操作系统,其RTM ...
- Java——UDP
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; //===== ...
- Eclipse Maven Web工程报错:java.lang.ClassNotFoundException: ContextLoaderListener
原因:打包项目时没有把相关Maven依赖包打到WEB-INF/lib下,正常情况下,会生成lib目录并把工程的所有依赖jar包都部署到该目录下. 解决:右键点击项目--选择Properties,选择D ...
- SCI/EI期刊投稿 Reply Letter 常用格式总结
SCI/EI期刊投稿Reply Letter常用格式总结 整个论文投稿的过程中,会遇到各种问题,需要我们向主编询问或是回复.下面主要总结了responses to the comme ...
- 谷歌浏览器 查看源码里的a:hover CSS样式 还有火狐的查看方式
谷歌浏览器查看hover css样式 直接实例: 选中a标签 然后右侧面板 出现 箭头 点击 出现Toggle Element state提示 下面再hover前打勾 直接就可以显示效果了 浏览器查看 ...
- Yii2 执行流程
原文地址: http://www.cnblogs.com/cresuccess/p/4874330.html
- HBase命令(一) -- 库操作
打开数据库 bin/start-hbase.sh //打开HBase bin/hbase shell //以命令行的方式打开Hbase控制台 Rest接口开启 bin/hbase rest //普通的 ...