Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js

题解 LuoguP4052文本生成器(AC自动机 + DP)

题意

https://www.luogu.com.cn/problem/P4052

算法

AC自动机上的套路DP

思路

正面处理困难,于是考虑容斥,求不合法的方案数。考虑使用AC自动机,则原问题转化为:求使这mm个字符串都匹配不上的字符串的个数。所以,匹配过程中经过的点,其failfail链上的节点(包括本身)都不能有结束节点。

dp(i,j)dp(i,j)表示从根节点开始走ii步到jj号节点的方案数,状态转移方程为:

dp(i,j)=!t[k].numdp(i1,k)t[k].numkfail

代码

copy
#include <bits/stdc++.h> using namespace std; const int maxn = 5e4 + 10,mode = 1e4 + 7; int n,f[6010][6010],m,ans; string a; struct AC{ int cnt; struct Tree{ int num,fail; int ch[30]; }t[maxn]; AC(){cnt = 0;} void build(string s){ int len = s.size(); int now = 0; for(int i = 0; i < len; ++ i){ int c = s[i] - 'A'; if(!t[now].ch[c]) t[now].ch[c] = ++cnt; now = t[now].ch[c]; } t[now].num = 1; } void get_fail(){ queue<int> q; for(int i = 0; i < 26; ++ i) if(t[0].ch[i]){ t[t[0].ch[i]].fail = 0; q.push(t[0].ch[i]); } while(!q.empty()){ int u = q.front(); q.pop(); for(int i = 0; i < 26; ++ i){ int v = t[u].ch[i]; if(v){ t[v].fail = t[t[u].fail].ch[i]; q.push(v); t[v].num |= t[t[v].fail].num; } else t[u].ch[i] = t[t[u].fail].ch[i]; } } } void DP(){ f[0][0] = 1; for(int i = 1; i <= m; ++ i) for(int j = 0; j <= cnt; ++ j) if(!t[j].num){ for(int k = 0; k < 26; ++ k) f[i][t[j].ch[k]] = (f[i][t[j].ch[k]] + f[i - 1][j]) % mode; } for(int i = 0; i <= cnt; ++ i) if(!t[i].num) ans += f[m][i], ans %= mode; } }ac; int ksm(int a, int b){ //递归版本快速幂 if(b == 1) return a; if(b == 0) return 1; if(b & 1) return ((a * ksm(a, b / 2)) % mode * ksm(a, b / 2)) % mode; else return (ksm(a, b / 2) * ksm(a, b / 2)) % mode; } int main(){ ios::sync_with_stdio(false); cin >> n >> m; for(int i = 1; i <= n; ++ i){ cin >> a; ac.build(a); } ac.get_fail(); ac.DP(); cout << (ksm(26, m) - ans + mode) % mode << endl; return 0; }
posted @   When_C  阅读(152)  评论(3编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起