原题

给出n个字符串,求随机生成一个m长度的字符串,有多少个是可辨识的(即出现了n个字符串中的任意字符串)


正难则反

求有多少个不可辨识的,26^m-不可辨识即为答案

f[i][j]表示填到第i个字符,在自动机上第j个节点时的答案

状态转移方程很明显:

f[i][j]+=f[i-1][f[j]]

#include<cstdio>
#include<cstring>
#define p 10007
#define N 6010
using namespace std;
int n,m,sze=1,ans1,ans2=1,a[N][27],fail[N],q[N],f[110][N];
char s[110];
bool is[N]; void ins()
{
int now=1,c,l=strlen(s);
for (int i=0;i<l;i++)
{
c=s[i]-'A'+1;
if (a[now][c]) now=a[now][c];
else now=a[now][c]=++sze;
}
is[now]=1;
} void acmatch()
{
int l=0,r=1,now;
q[0]=1;fail[1]=0;
while (l<r)
{
now=q[l++];
for (int i=1;i<=26;i++)
{
if (!a[now][i]) continue;//如果没有这条边
int k=fail[now];
while (!a[k][i]) k=fail[k];//找到第一个有该边的该节点的后缀节点
fail[a[now][i]]=a[k][i];//我儿子的后缀节点等于我的后缀节点的该边
if (is[a[k][i]])//传递结尾标记
is[a[now][i]]=1;
q[r++]=a[now][i];
}
}
} void dp(int x)
{
for(int i=1;i<=sze;i++)
{
if (is[i] || !f[x-1][i]) continue;//如果这个节点是结尾(不能出现结尾)或者到前一位就已经不能在这个节点了
for (int j=1;j<=26;j++)//枚举下一位
{
int k=i;
while (!a[k][j]) k=fail[k];//找到后缀节点
f[x][a[k][j]]=(f[x][a[k][j]]+f[x-1][i])%p;//更新答案
}
}
} int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=26;i++) a[0][i]=1;
for (int i=1;i<=n;i++)
{
scanf("%s",s);
ins();
}
acmatch();
f[0][1]=1;
for (int i=1;i<=m;i++) dp(i);//f[i][j]表示考虑到第x位在AC自动机上第j个节点的答案
for (int i=1;i<=m;i++)
ans2=ans2*26%p;//26^m为总字符串数
for (int i=1;i<=sze;i++)
if (!is[i]) ans1=(ans1+f[m][i])%p;//ans2为不能认出来的字符串数
printf("%d",(ans2-ans1+p)%p);
return 0;
}

[bzoj] 1030 文本生成器 || AC自动机+dp的更多相关文章

  1. bzoj1030 文本生成器(AC自动机+dp)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4777  Solved: 1986[Submit][Stat ...

  2. [JSOI2007]文本生成器 --- AC自动机 + DP

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

  3. 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp

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

  4. 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp

    正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...

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

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

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

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

  7. 【BZOJ-1030】文本生成器 AC自动机 + DP

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3253  Solved: 1330[Submit][Stat ...

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

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

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

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

随机推荐

  1. facebook原生广告添加adchoice图标

    1.在需要显示adchoice的地方添加一个textview: <LinearLayout android:id="@+id/ad_ic_action" android:la ...

  2. 「日常训练」 Counting Cliques(HDU-5952)

    题意与分析 题源:2016ACM/ICPC沈阳现场赛. 这题让我知道了什么是团,不过最恶心的还是这题的数据了,卡了无数次- - 解决方法是维护一个G数组,不能去遍历邻接矩阵.至少我改了这么一个地方就过 ...

  3. ThreadLocal 线程的私有内存

    话说在<操作系统原理>这门课里面,我们学到了很多概念:进程.线程.锁.PV操作.读写者问题等等,大家还记得么?(估计有些概念早已忘记了吧,哈哈哈~) 其中关于进程.线程和锁的东西是我们平时 ...

  4. STM32单片机是如何启动的?

    STM32单片机是如何启动的? STM32中的内存 STM32中的内存包含两块主要区域:flash memory(只读).static ram memory(SRAM,读写).其中,flash mem ...

  5. vue学习笔记(三):vue-cli脚手架搭建

    一:安装vue-cli脚手架: 1:为了确保你的node版本在4.*以上,输入 node -v 查看本机node版本,低于4请更新. 2:输入:  npm install -g vue-cli     ...

  6. Java学习个人备忘录之异常

    概述 异常:是在运行时期发生的不正常情况. 在java中用类的形式对不正常情况进行了描述和封装对象. 描述不正常的情况的类,就称为异常类. 以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问 ...

  7. Daily Scrum 11

    今天我们小组开会内容分为以下部分: part 1: 针对学长的搜索算法进行优化,每人发表自己的看法; part 2:对积分系统.防滥用.搜索算法优化部分代码任务的讨论和分工: part 3:进行明日的 ...

  8. 20162328蔡文琛week03

    学号 2006-2007-2 <程序设计与数据结构>第X周学习总结 教材学习内容总结 在第三章,我学习到了更多有关于java.util包的知识.了解了多个引用变量可以指向同一个对象.而且J ...

  9. finecms

    finecms地址 还不错的国内CMS http://www.dayrui.com/doc/246.html

  10. ubuntu 安装 hustoj

    https://github.com/zhblue/hustoj 准备工作: http://www.java123.net/v/961634.html 1.首先打开命令行,切换到root身份,获得最新 ...