博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷 P4052】 [JSOI2007]文本生成器(AC自动机,DP)
阅读量:6457 次
发布时间:2019-06-23

本文共 1941 字,大约阅读时间需要 6 分钟。

AC自动机上dp第一题嗷。

如果直接求可读文本的数量,显然要容斥,不好搞。
于是考虑求不可读文本的数量,再用\(26^m\)减去其即可。
建出AC自动机,如果一个节点为单词结尾或其fail链中有节点为单词结尾,那么这个点就不能走,这个显然可以在bfs的时候顺便求出来。
然后就是大家熟知的方案数dp了,\(f[n][m]\)表示走到节点\(n\)\(m\)步的方案数,转移就不说了。
最后答案就是\(26^m-\sum_{i=1}^mf[i][m]\)

#include 
#include
#include
#include
using namespace std;const int MAXN = 60010;const int MAXM = 110;const int MOD = 10007;struct Node{ int fail, next[26];}AC[MAXN];int n, u, cnt, m;queue
q;int ban[MAXN], f[MAXN][MAXM];char a[MAXN];void insert(){ int len = strlen(a + 1), w; u = 0; for(int i = 1; i <= len; ++i){ w = a[i] - 'A'; if(!AC[u].next[w]) AC[u].next[w] = ++cnt; u = AC[u].next[w]; } ban[u] = 1;}void BuildFail(){ u = 0; for(int i = 0; i < 26; ++i) if(AC[u].next[i]) q.push(AC[u].next[i]); while(q.size()){ u = q.front(); q.pop(); ban[u] |= ban[AC[u].fail]; for(int i = 0; i < 26; ++i) if(AC[u].next[i]){ q.push(AC[u].next[i]); AC[AC[u].next[i]].fail = AC[AC[u].fail].next[i]; } else AC[u].next[i] = AC[AC[u].fail].next[i]; }}int fast_pow(int n, int k){ int ans = 1; while(k){ if(k & 1) ans = ans * n % MOD; n = n * n % MOD; k >>= 1; } return ans;}int ans;int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; ++i){ scanf("%s", a + 1); insert(); } BuildFail(); f[0][0] = 1; for(int i = 1; i <= m; ++i) for(int j = 0; j <= cnt; ++j) for(int k = 0; k < 26; ++k) if(!ban[AC[j].next[k]]) f[AC[j].next[k]][i] = (f[AC[j].next[k]][i] + f[j][i - 1]) % MOD; ans = fast_pow(26, m); for(int i = 0; i <= cnt; ++i) ans = (ans - f[i][m] + MOD) % MOD; printf("%d\n", ans); return 0;}

转载于:https://www.cnblogs.com/Qihoo360/p/10884913.html

你可能感兴趣的文章
CentOS7.4安装mysql5.7
查看>>
U-BOOT之一:BootLoader 的概念与功能
查看>>
我的路上
查看>>
Velocity处理多余空白和多余空白行问题
查看>>
内容开发平台(PLATFORM)
查看>>
java值传递
查看>>
判断一个数是否为素数的一个讨论(一)
查看>>
DB2与oracle有什么区别
查看>>
创建一个多级文件目录
查看>>
UTM: 如何注册 SonicWALL 防火墙
查看>>
关于延续训练的倡导
查看>>
Shell 使用技巧
查看>>
awk在文本前加格式
查看>>
56、组播配置实验之PIM Sparse Mode利用Auto-RP动态选取RP
查看>>
tomcat安装配置
查看>>
JMX连接Mbean获取Tomcat信息(jconsole远程查看Mbean)
查看>>
VDI序曲十五 配置 RemoteFX 以获得最佳体验
查看>>
ecshop2.71 页面静态化步骤
查看>>
最详细的PHP flush()与ob
查看>>
ESXi5.1 下物理主机忘记root用户密码的破解方法
查看>>