传送门

好像这题的确只能用AC自动机做了……Aufun大佬太强啦

正着难我们反着做,用总共单词个数减去没有一个单词都不包含的

然后考虑怎么处理一个单词都不包含的,就是跑不到单词的结尾节点

定义$f[i][j]$为当前在自动机上$j$点且串长为$i$时的方案总数,然后只要从父亲往儿子不断转移就好了

顺便注意如果一个单词后缀是另一个单词那这个单词也不能走

话说好像SAM还是可以做啊,和AC自动机差不多的做法?不过懒得打了所以也不知道到底可不可以

 //minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=,mod=;
int ch[N][],End[N],fail[N],f[][N];char s[N];
int n,m,tot,ans,sum;
queue<int> q;
inline void init(){
int u=,len=strlen(s+);
for(int i=;i<=len;++i){
int x=s[i]-'A';
if(!ch[u][x]) ch[u][x]=++tot;
u=ch[u][x];
}
End[u]|=;
}
void build(){
for(int i=;i<;++i)
if(ch[][i]) q.push(ch[][i]);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=;i<;++i){
if(!ch[u][i]){
ch[u][i]=ch[fail[u]][i];continue;
}
End[ch[u][i]]|=End[ch[fail[u]][i]],
fail[ch[u][i]]=ch[fail[u]][i];
q.push(ch[u][i]);
}
}
}
inline int ksm(int x,int y){
int res=;
while(y){
if(y&) (res*=x)%=mod;
(x*=x)%=mod,y>>=;
}
return res;
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
scanf("%s",s+),init();
build();
f[][]=;
for(int i=;i<=m;++i)
for(int j=;j<=tot;++j)
for(int k=;k<;++k)
if(!End[ch[j][k]]) (f[i][ch[j][k]]+=f[i-][j])%=mod;
for(int i=;i<=tot;++i) (ans+=f[m][i])%=mod;
sum=ksm(,m);
printf("%d\n",(sum-ans+mod)%mod);
return ;
}

洛谷P4052 [JSOI2007]文本生成器(AC自动机)的更多相关文章

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

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

  2. [洛谷P4052][JSOI2007]文本生成器

    题目大意:有$n$个字符串$s_i$,问有多少个长度为$m$的字符串至少包含$n$个字符串中的一个,字符集 A-Z .$s_i,m\leqslant100,n\leqslant60$ 题解:$AC$自 ...

  3. 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Java for LeetCode 106 Construct Binary Tree from Inorder and Postorder Traversal

    Construct Binary Tree from Inorder and Postorder Traversal Total Accepted: 31041 Total Submissions: ...

  2. ES6中的class 与prototype

    一.定义构造函数 在以前的js中,生成一个对象实例,需要先定义构造函数,然后通过prototype 的方式来添加方法,在生成实例: function Person(){ this.name = &qu ...

  3. SETEVENT的使用

    来源:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686915(v=vs.85).aspx 昨天看到这个SetEvent的方法 ...

  4. 利用javascript动态向网页中添加表格

    效果图如下: 以下是代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  5. python之tkinter_2

    关于tkinter的组件介绍,这篇博客很详细: https://www.cnblogs.com/aland-1415/p/6849193.html tkinter is to make interfa ...

  6. hdu-5806 NanoApe Loves Sequence Ⅱ(尺取法)

    题目链接: NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others)     Memory Limit: 262144/13107 ...

  7. CDH5.12.1 安装部署

    ###通过http://192.168.50.200:7180/cmf/login 访问CM控制台 4.CDH安装 4.1CDH集群安装向导 1.admin/admin登陆到CM 2.同意licens ...

  8. COGS 2581 无聊的会议V2

    传送 题目大意 给定一个长为\(n\)的序列,定义\(y\)在三元对\((x,y,z)\)中成为中心轴当且仅当同时满足:\(a_x = a_y = a_z,y-x=z-y,x<y<z\)对 ...

  9. Excel添加水印

    Excel添加水印[源码下载] 步骤一:根据生成图片的类创建水印图片 步骤二: 代码在Excel中根据第一行获取sheet的列数[sheet.getRow(0).getLastCellNum() ], ...

  10. Linux打开防火墙telnet端口

    检查端口情况:netstat -an | grep 22 关闭端口号:iptables -A INPUT -p tcp --drop 端口号-j DROP                    ipt ...