bzoj1559: [JSOI2009]密码 AC自动机+状压DP

本文针对一道字符串构造题目,详细解析了AC自动机的应用及动态规划算法的设计思路。文章强调了正确理解题意的重要性,并分享了实现过程中的常见错误及解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目https://www.lydsy.com/JudgeOnline/problem.php?id=1559
题解https://www.cnblogs.com/LadyLex/p/7514403.html
关键:首先不要看错题意,是自己随便构造串包含给定串即可,不是用给定串拼接(所以拼接的方案数怎么做啊)
AC自动机疯狂打错,我在干什么?
往后加一个字符应该从该节点开始,而不是fail[x]
for的时候每次变量名都要清空
dp时把长度放在第一维便于调试

输出方案就是倒着dp合法方案
要去个重,目标串就是在fail树上的叶子

`
这里写代码片
#include

define maxn 120

define N 1200

typedef long long ll;
ll f[maxn][26][N],ans;
int fail[maxn],deg[maxn],tag[maxn],next[maxn][26],num[maxn],cnt;
int n,L,tot,cur,K;
int q[maxn],hh,tt;
char ch[maxn];
struct node{
char s[maxn];
bool operator < (node a)const{
int l1 = strlen(s + 1) , l2 = strlen(a.s + 1);
for (register int i = 1 ; i <= min(l1,l2) ; i++)
if ( s[i] != a.s[i] )
return s[i] < a.s[i];
return l1 < l2;
}
void print(){
//puts(s);
int l = strlen(s + 1);
for (int i = 1 ; i <= l ; i++) cout<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值