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建立在 ...
随机推荐
- BZOJ3160: 万径人踪灭
设a[i]=bool(s[i]=='a'),b[i]=bool(s[i]=='b'),考虑a和a.b和b的卷积,由于卷积是对称的,就可以统计出不连续回文子串个数了.可能说得比较简略.再用manache ...
- 最小路径(prim)算法
#include <stdio.h>#include <stdlib.h>/* 最小路径算法 -->prim算法 */#define VNUM 9#define MV 6 ...
- js初学—js全自定义单选框
代码如下: <script type="text/javascript"> window.onload=function() { var oIput=document. ...
- php返回json数据中文显示的问题
PHP5.4版本,已经给Json新增了一个选项: JSON_UNESCAPED_UNICODE.加上这个选项后,就不会自动把中文编码了. echo json_encode("厦门" ...
- Java数据结构——链表-单链表
<1>链表 <2>引用和基本类型 <3>单链表 //================================================= // Fil ...
- Java数据库——JDBC 2.0操作
可滚动的结果集 让结果集滚动起来 //================================================= // File Name : JDBC20_demo //-- ...
- svn 强制用户添加注释 和 允许用户修改注释
当我们用TortoiseSVN提交代码时,有很多人不喜欢写注释,导致以后代码版本多,也不清楚哪个版本到底改了什么东西.所以在提交的时候,我会强制要求添加注释.这是如何实现的?这个话题就涉及到了svn的 ...
- header的安全配置指南
0x00 背景 在统计了Alexa top 100万网站的header安全分析之后(2012年11月 - 2013年3月 - 2013年11月),我们发现其实如何正确的设置一个header并不是一件容 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【四】——实现模型工厂,依赖注入以及格式配置
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在上一篇中,我们已经初步开始使用Web Api了,但同时出现了一些很多不足之处,本章我们就着 ...
- EF事务
var db = this.UnitOfWork as CodeFirstDbContext; using (var tan = db.Database.BeginTransaction()) { t ...