BZOJ 1030 文本生成器
很老的题目了,很早以前学AC自动机的时候就A过一次
今天算是复习啦
我们可以把问题转化成一个给定字符串都没出现的字符串有多少个
我们建立AC自动机,设dp[i][j]表示走了i步当前在j节点上
在DP的过程中不转移单词节点即可
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; const int maxn=6010;
const int mod=10007;
int n,m,cnt=1,ans;
char s[maxn];
int t[maxn][26];
int fail[maxn];
int dp[102][maxn];
bool end[maxn];
queue<int>Q; void insert(){
scanf("%s",s+1);
int len=strlen(s+1),now=1;
for(int i=1;i<=len;++i){
int id=s[i]-'A';
if(!t[now][id])t[now][id]=++cnt;
now=t[now][id];
}end[now]=true;
}
void build_fail(){
Q.push(1);fail[1]=0;
while(!Q.empty()){
int u=Q.front();Q.pop();
end[u]|=end[fail[u]];
for(int i=0;i<26;++i){
int k=fail[u];
while(k&&!t[k][i])k=fail[k];
if(t[u][i]){
fail[t[u][i]]=k?t[k][i]:1;
Q.push(t[u][i]);
}else t[u][i]=k?t[k][i]:1;
}
}return;
}
void Get_DP(){
dp[0][1]=1;
for(int i=0;i<m;++i){
for(int j=1;j<=cnt;++j){
if(!dp[i][j])continue;
for(int k=0;k<26;++k){
int now=t[j][k];
if(end[now])continue;
dp[i+1][now]+=dp[i][j];
if(dp[i+1][now]>=mod)dp[i+1][now]-=mod;
}
}
}return;
}
int pow_mod(int v,int p){
int tmp=1;
while(p){
if(p&1)tmp=tmp*v%mod;
v=v*v%mod;p>>=1;
}return tmp;
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)insert();
build_fail();
Get_DP();
ans=0;
for(int i=1;i<=cnt;++i){
ans=ans+dp[m][i];
if(ans>=mod)ans-=mod;
}
ans=pow_mod(26,m)-ans;
ans=(ans+mod)%mod;
printf("%d\n",ans);
return 0;
}
BZOJ 1030 文本生成器的更多相关文章
- BZOJ 1030 文本生成器 | 在AC自动机上跑DP
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1030 题解: 鸽 #include<cstdio> #include<al ...
- [bzoj] 1030 文本生成器 || AC自动机+dp
原题 给出n个字符串,求随机生成一个m长度的字符串,有多少个是可辨识的(即出现了n个字符串中的任意字符串) 正难则反 求有多少个不可辨识的,26^m-不可辨识即为答案 f[i][j]表示填到第i个字符 ...
- 【BZOJ】【1030】【JSOI2007】文本生成器
AC自动机/DP Orz ZYF 玛雅快要省选了,赶紧复(xue)习(xi)一下AC自动机…… 其实在AC自动机上DP并没有当初想的那么复杂……就是把DP的转移关系换成了AC自动机上的边而已(不过这题 ...
- BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3953 Solved: 1614[Submit][Stat ...
- BZOJ 1030 [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2624 Solved: 1087[Submit][Stat ...
- 【BZOJ】1030: [JSOI2007]文本生成器(递推+ac自动机)
http://www.lydsy.com/JudgeOnline/problem.php?id=1030 其实做了1009也不会感到很难了,无非将kmp变成了ac自动机. 设f[i,j]表示前i个串当 ...
- bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2635 Solved: 1090 [id=1030&qu ...
- BZOJ 1030 【JSOI2007】 文本生成器
Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生 ...
- 1030: [JSOI2007]文本生成器 - BZOJ
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
随机推荐
- css 等高补偿法
html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...
- java 内部类定义在局部时需要注意的情况
/*内部类定义在局部时,1,不可以被成员修饰符修饰2,可以直接访问外部类中的成员,因为还持有外部类中的引用. 但是不可以访问它所在的局部中的变量.只能访问被final修饰的局部变量.*/clas ...
- Linux 信号量 生产者消费者小例题
菜鸟偶遇信号量,擦出火花(只有不熟才会有火花).于是上网搜资料和看<Unix环境高级编程>实现了几个小例题,高手请勿喷!这几位写得非常好啊: 题目来源: http://www.it165. ...
- Centos 6.5 配置nginx服务
官方网站:http://nginx.org最新版本:1.7.11官方文档:http://nginx.org/en/docs/ 一.安装NGINX查看当前centos版本: #cat /etc/redh ...
- 广度优先算法BFS
package myalgorithm; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; / ...
- JavaScript jQuery 事件、动画、扩展
事件 因为JavaScript在浏览器中以单线程模式运行,页面加载后,一旦页面上所有的JavaScript代码被执行完后,就只能依赖触发事件来执行JavaScript代码. 浏览器在接收到用户的鼠标或 ...
- Uploadify 3.2 not work in IE10
uploadify版本:Uploadify Version 3.2.1 現象:在IE10下uploadify上傳按鈕點擊失效 解決方案:替換uploadify下的js引用包 替換文件下載地址: 下载地 ...
- redis学习系列
redis学习系列 基本看完 最近在看redis的代码,简单记录下自己认为重要的点,自己写比较费时间的,我会把查到的资料贴出来方便查看 淘宝的redis内存分析 http://www.searchtb ...
- html5 全屏滚动活动页学习
先看几个具体的实例: 1.腾讯娱乐:http://ent.qq.com/zt2014/qqent/h5.htm?from=groupmessage&isappinstalled=0 2.苏宁互 ...
- phonegap + 推送 + 页面跳转 (ios)
os如果没有页面跳转的需求的话就使用极光推送,如果有页面跳转如果用了极光推送就只有用oc去写,但是我不会oc,所以智能放弃极光选用ios自己的apns来实现 新建项目跟安卓创建项目差不多,新建完成后就 ...