题意

给你n个串,求长度为m的串的方案数,使得这个串至少包含一个这n个任意一个串

思路

转化为求一个也不包含的方案数
\(dp[i][j]\)为第i个字符,匹配到ac自动机上的j号节点的方案数,显然不能匹配到有结束点的地方
fail节点的性质:指向当前串的最长后缀所在的节点
所以当前节点的fail节点为结束点也不行
所有原本没有的空节点在build的时候会指向根节点
所以空节点都在dp[i][0]里

代码

空间开小了一直wa

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1using namespace std;typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;const db eps = 1e-6;
const int mod = 10007;
const int maxn = 5e5+100;
const int maxm = 2e6+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);int dp[111][7777];
int n,m;
struct AC{//局部变量没有默认0!int trie[maxn][26];int num[maxn];//单词出现次数int fail[maxn];int vis[maxn];//ask函数用到int tot;//多测可写个initvoid init(){tot=0;mem(vis,-1);mem(trie,0);}void add(char *s){int root = 0, len = strlen(s+1);for(int i = 1; i <= len; i++){int x = s[i]-'A';if(!trie[root][x])trie[root][x]=++tot;root=trie[root][x];}num[root]++;vis[root]=0;}void build(){queue<int>q;for(int i = 0; i < 26; i++){if(trie[0][i]){fail[trie[0][i]]=0;q.push(trie[0][i]);}}while(!q.empty()){int now = q.front();q.pop();for(int i = 0; i < 26; i++){if(trie[now][i]){fail[trie[now][i]]=trie[fail[now]][i];q.push(trie[now][i]);}else trie[now][i]=trie[fail[now]][i];}vis[now]&=vis[fail[now]];//if(vis[fail[now]]==0)vis[now]=0;}}void solve(){dp[0][0]=1;for(int i = 0; i < m; i++){for(int j = 0; j <= tot; j++){if(vis[j]==0)continue;for(int k = 0; k < 26; k++){int to = trie[j][k];if(vis[to]==0)continue;(dp[i+1][to]+=dp[i][j])%=mod;}}}}}ac;char a[maxn];
int main(){ac.init();scanf("%d %d", &n, &m);for(int i = 1; i <= n; i++){scanf("%s",a+1);ac.add(a);}ac.build();ac.solve();int ans = 1;for(int i = 1; i <= m; i++){ans=ans*26%mod;}/*for(int j = 0; j <= ac.tot; j++){printf("%d %d\n",j,ac.vis[j]);}for(int i = 0; i <= ac.tot; i++){printf("%d:: \n",i);for(int j = 0; j < 26; j++){printf("%d %d\n",j,ac.trie[i][j]);}}*//*for(int i = 1; i <= m; i++){for(int j = 0; j <= ac.tot; j++){printf("%d %d == %d\n",i,j,dp[i][j]);}}*/for(int i = 0; i <= ac.tot; i++){ans=(ans+mod-dp[m][i])%mod;}printf("%d",ans);return 0;
}
/*
10 18
DCSDG
DSSF
SADAV
DSATWYYH
FDHFIS
DFGDFGGD
SASSSS
HHEBB
SFTWRTWW
ZSDFZDS*/

转载于:https://www.cnblogs.com/wrjlinkkkkkk/p/11542363.html

BZOJ 1030 [JSOI2007]文本生成器(ac自动机+dp)相关推荐

  1. BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3953  Solved: 1614 [Submit][St ...

  2. 1030: [JSOI2007]文本生成器 ac自动机+dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...

  3. [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)

    题目传送门 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...

  4. [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 dp)

    Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机 ...

  5. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

  6. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  7. bzoj1030 [JSOI2007] 文本生成器(ACAM+dp)

    求长度为m的,至少包含一个模式串的文本串个数. 我们考虑用所有的个数26m26^m减去一个模式串也不包含的个数. 后者我们可以建出ACAM,然后在ACAM上跑dp即可. #include <cs ...

  8. [BZOJ1030] [JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Description JSOI交给队员ZYX一个任务,编制一个称之为&qu ...

  9. [BZOJ1030][JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5025  Solved: 2080 [Submit][St ...

  10. HDU 2296 Ring AC自动机 + DP

    题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路:  AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...

最新文章

  1. android荧光进度条,CSS3 彩色荧光棒进度条
  2. sort与sorted
  3. socket编程之inet_addr和inet_ntoa
  4. 在iframe中显示嵌套网页的指定部分
  5. iOS 数据持久化 NSUserDefault
  6. [UE4]复制引起的重复对象
  7. IDEA 谷歌翻译报错 TKK
  8. Hadoop架构与原理:Hadoop系统架构原理解析
  9. 风险模型—CreditMetrics模型1
  10. element-ui图标显示不出来问题
  11. codewars练习(javascript)-2021/3/23
  12. php gps 车辆定位,员工GPS解决方案
  13. 阿里巴巴字体图标的使用
  14. 第四十二次总结:json模块与pickle模块
  15. 尤雨溪:Vue3.0 官宣彻底抛弃 IE 浏览器
  16. 神经网络学习小记录58——Keras GhostNet模型的复现详解
  17. android通讯录根据手机号码查询姓名
  18. 哈尔滨工程大学考研经验分享(中):初试
  19. 苹果icloud备忘录误删了怎么恢复?iphone备忘录突然清空
  20. ZLMediaKit Windows编译快速入门

热门文章

  1. Tomcat6.0连接器源码分析3
  2. windows 端口占用
  3. java 小程序--杨辉三角
  4. Stream篇(2)【TextReader】
  5. PsExec:一个非常实用的【远程运行】工具
  6. 波形分析--串口数据
  7. php enum 数字类型插入失败的解决办法
  8. Python3 从零单排27_锁信号量Event定时器
  9. 生产环境下lnmp的权限说明
  10. VS项目属性的一些配置项的总结(important)