bzoj3473: 字符串(后缀自动机+启发式合并)

该博客介绍了如何利用后缀自动机和启发式合并方法解决一个字符串相关的问题。博主在调参过程中遇到困难,最终通过采用深度优先搜索(DFS)版本的启发式合并成功通过了测试。问题要求对于每个给定的字符串,找出有多少子串在至少k个其他字符串中出现。

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

传送门
调代码调的我怀疑人生。
启发式合并用迭代写怎么都跑不过(雾
换成了 d f s dfs dfs版本的终于过了233.
题意简述:求给出 n n n个字串,对于每个给定的字串求出其有多少个字串在至少 k k k个剩下字串中出现过。


显然先对所有字串建一个 s a m sam sam出来,然后对于每个状态用一个 s e t set set维护在哪些字串里面出现过(这个显然需要在建完 p a r e n t parent parent树之后启发式合并一波),最后拿每个串在上面匹配,如果当前的状态不满足题意就沿着树边向上跳即可。
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int M=2e5+5;
int k,T;
string s[M];
typedef long long ll;
struct SAM{
   
	int last,tot,len[M],son[M][26],link[M],cnt[M],rk[M],val[M];
	set<int>S[M
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值