【BZOJ】【1030】【JSOI2007】文本生成器

AC自动机/DP



  Orz ZYF

  玛雅快要省选了,赶紧复(xue)习(xi)一下AC自动机……

  其实在AC自动机上DP并没有当初想的那么复杂……就是把DP的转移关系换成了AC自动机上的边而已(不过这题好像搞成了Trie图?)

 1 /**************************************************************
 2     Problem: 1030
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:208 ms
 7     Memory:7148 kb
 8 ****************************************************************/
 9
10 //BZOJ 1030
11 #include<vector>
12 #include<cstdio>
13 #include<cstring>
14 #include<cstdlib>
15 #include<iostream>
16 #include<algorithm>
17 #define rep(i,n) for(int i=0;i<n;++i)
18 #define F(i,j,n) for(int i=j;i<=n;++i)
19 #define D(i,j,n) for(int i=j;i>=n;--i)
20 #define pb push_back
21 using namespace std;
22 inline int getint(){
23     int v=0,sign=1; char ch=getchar();
24     while(ch<‘0‘||ch>‘9‘){ if (ch==‘-‘) sign=-1; ch=getchar();}
25     while(ch>=‘0‘&&ch<=‘9‘){ v=v*10+ch-‘0‘; ch=getchar();}
26     return v*sign;
27 }
28 const int N=6010,INF=~0u>>2;
29 typedef long long LL;
30 /******************tamplate*********************/
31 const int MOD=10007;
32 int n,m,cnt=1;
33 struct Trie{
34     int ch[26],cnt,fail;
35     bool sign;
36 }T[N];
37 inline int id(char c){return c-‘A‘;}
38 void ins(char *s){
39     int x=1,y;
40     rep(i,strlen(s)){
41         y=id(s[i]);
42         if (T[x].ch[y]==0)
43             T[x].ch[y]=++cnt;
44         x=T[x].ch[y];
45     }
46     T[x].sign=1;
47 }
48 int Q[N];
49 void make_fail(){
50     int l=0,r=-1;
51     Q[++r]=1;
52     while(l<=r){
53         int x=Q[l++],y,j;
54         rep(i,26){
55             j=T[x].fail;
56             while(j && !T[j].ch[i]) j=T[j].fail;
57             if (T[x].ch[i]){
58                 y=T[x].ch[i];
59                 T[y].fail=j ? T[j].ch[i] : 1;
60                 T[y].sign=T[y].sign|T[T[y].fail].sign;
61                 Q[++r]=y;
62             }else T[x].ch[i]=j ? T[j].ch[i] : 1;
63         }
64     }
65 }
66 int f[110][N][2];
67 void dp(){
68     f[0][1][0]=1;
69     rep(i,m) F(j,1,cnt) rep(k,26) F(l,0,1)
70         if(T[T[j].ch[k]].sign)
71             (f[i+1][T[j].ch[k]][1]+=f[i][j][l])%=MOD;
72         else (f[i+1][T[j].ch[k]][l]+=f[i][j][l])%=MOD;
73 }
74 char s[N];
75 int main(){
76 #ifndef ONLINE_JUDGE
77     freopen("1030.in","r",stdin);
78     freopen("1030.out","w",stdout);
79 #endif
80     n=getint(); m=getint();
81     F(i,1,n){
82         scanf("%s",s);
83         ins(s);
84     }
85     make_fail();
86     dp();
87     int ans=0;
88     F(i,1,cnt) (ans+=f[m][i][1])%=MOD;
89     printf("%d\n",ans);
90     return 0;
91 }

1030: [JSOI2007]文本生成器

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 2224  Solved: 923
[Submit][Status][Discuss]

Description

JSOI
交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版。该软件可以随
机生成一些文章―――总是生成一篇长度固定且完全随机的文章——
也就是说,生成的文章中每个字节都是完全随机的。如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章a包含单词b,
当且仅当单词b是文章a的子串)。但是,即使按照这样的标准,使用者现在使用的GW文本生成器v6版所生成的文章也是几乎完全不可读的?。
ZYX需要指出GW文本生成器 v6生成的所有文本中可读文本的数量,以便能够成功获得v7更新版。你能帮助他吗?

Input

输入文件的第一行包含两个正整数,分别是使用者了解的单词总数N (<= 60),GW文本生成器 v6生成的文本固定长度M;以下N行,每一行包含一个使用者了解的单词。 这里所有单词及文本的长度不会超过100,并且只可能包含英文大写字母A..Z  。

Output

一个整数,表示可能的文章总数。只需要知道结果模10007的值。

Sample Input

2 2
A
B

Sample Output

100

HINT

Source

[Submit][Status][Discuss]

时间: 2025-01-02 16:41:08

【BZOJ】【1030】【JSOI2007】文本生成器的相关文章

bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)

1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2635  Solved: 1090 [Submit][Status][Discuss] Description JSOI交给队员ZYX一个任务.编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们如今使用的是GW文本生成器v6版.该软件能够随机生成一些文章―――总是生成一篇长度固定且全然随机的文章-- 也就是说,生成的文章中

BZOJ 1030: [JSOI2007]文本生成器( AC自动机 + dp )

之前一直没调出来T^T...早上刷牙时无意中就想出错在哪里了... 对全部单词建AC自动机, 然后在自动机上跑dp, dp(i, j)表示匹配到了第i个字符, 在自动机上的j结点的方案数, 然后枚举A~Z进行转移. -------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; #define idx(c) ((c) -

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

1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3059  Solved: 1255[Submit][Status][Discuss] Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章—— 也就是说,生成的文章中每个字节都是完

bzoj 1030: [JSOI2007]文本生成器 (ac自动机上的dp)

1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2635  Solved: 1090 [Submit][Status][Discuss] Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章-- 也就是说,生成的文章中

BZOJ 1030 [JSOI2007]文本生成器(AC自动机)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给定串的数量,用全集去减即可, 对于给定串建立AC自动机,用1节点作为根,0节点向1连全字符集转移作为超级源, 那么0->match能匹配所有不包含给定串的串, 记dp[i][j]表示匹配了i长度,匹配到AC自动机j节点的串数量, 统计之后取补集即可. [代码] #include <cstdio&g

bzoj 1030: [JSOI2007]文本生成器

AC自动机的fail,然后用fail搞搞DP,不懂不懂,,,,啊啊啊啊啊啊 1 #include<bits/stdc++.h> 2 #define N 1000005 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 using namespace std; 6 inline int ra() 7 { 8 int x=0,f=1; char ch=getchar(); 9 while (ch<'0' || ch>'9') {if (

1030: [JSOI2007]文本生成器

1030: [JSOI2007]文本生成器 https://www.lydsy.com/JudgeOnline/problem.php?id=1030 分析: AC自动机+dp. 正难则反,求满足的,可以求出不满足的,用总的减去.所以考虑如何就出所有的长度为m的串里,没有出现任何一个单词的个数. 建立AC自动机,然后会有一些点是一定不能走的,这些点要么是某些单词的结尾,或者是包含了某些单词(以它结尾的串的后缀是一个单词). 然后f[i][j]表示当前有多少位,在AC自动机的哪个位置的方案数.枚举

【BZOJ】1030: [JSOI2007]文本生成器(递推+ac自动机)

http://www.lydsy.com/JudgeOnline/problem.php?id=1030 其实做了1009也不会感到很难了,无非将kmp变成了ac自动机. 设f[i,j]表示前i个串当前匹配到j的节点的方案数.. 然后自己想. sb错1:ac自动机的节点开小了(自己想错了..以为最多节点就是层数×分支(26)....于是..其实是n个串的长度和...) sb错2:ac自动机bfs时没有维护信息啊!!只维护了一个fail... #include <cstdio> #include

【BZOJ 1030】 [JSOI2007]文本生成器

1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2017  Solved: 834 [Submit][Status] Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章-- 也就是说,生成的文章中每个字节都是完全随机

BZOJ1030:[JSOI2007]文本生成器

1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4859  Solved: 2019[Submit][Status][Discuss] Description JSOI交给队员ZGX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些战舰狗,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章-- 也就是说,生成的文章中每个字