【学习笔记】CF1037H Security

本文介绍了一种基于SAM(SuffixAutomaton)的数据结构解决字符串相关问题的方法,特别是关于字典序和最长公共前后缀(LCS)的查询。文章提到,在固定右边界的情况下,问题可以通过离线处理简化,避免了使用线段树合并的复杂性。代码示例展示了如何构建和操作SAM来高效地处理这些查询。

非常基础的SAMSAMSAM题目。

假设给你了S1S_1S1,那么显然非常好求,随便怎么搞都行。

字典序这玩意也非常好翻译啊,直接枚举前缀LCSLCSLCS就完了。

然后就是实现细节。乍一看这玩意要线段树合并,还要可持久化啊 直接把我劝退了 。不过如果固定了rrr就非常好做,因此直接一波离线即可。

很久没打这种数据结构了

一遍过了,就很离谱。要是考场上有这手感还愁打不出来数据结构???

#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define ll long long
using namespace std;
const int N=4e5+5;
int Q,n,tot,last,L[N],R[N],ed[N];
int num,dfn[N],sz[N],id[N];
string s;
string q[200005];
string ans[200005];
vector<int>G[N];
vector<int>g[N];
struct node{
   
   
	int link,len,to[26];
}t[N];
void extend(char c){
   
   
	int cur=++tot;
	t[cur].len=t[last].len+1;
	int p=last;
	while(p!=-1&&!t[p].to[c-'a']){
   
   
		t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值