[AHOI2013] 差异 题解
后缀自动机维护子串公共后缀方便一点,所以直接倒序插入字符串即可。
我们给所有前缀打上标记,然后跑树形 \(dp\),设 \(sum_i\) 表示第 \(i\) 个点的子树内有多少个前缀,\(ans\) 统计 \(\sum \text{LCP}(T_i,T_j)\),则有:
\]
简化求解式发现就是 \(\dfrac{n(n-1)(n+1)}{2}-ans\),时间复杂度 \(O(n)\)。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5;
struct SAM{
int id,sm[N],ln[N];
int tl,tr[N][26],pr[N];
vector<int>g[N];ll ans;
SAM(){pr[0]=-1;}
void cpy(int x,int y){
for(int i=0;i<26;i++)
tr[x][i]=tr[y][i];
pr[x]=pr[y];ln[x]=ln[y];
}void add(int x){
ln[++id]=ln[tl]+1;
int p=tl;tl=id;
while(~p&&!tr[p][x])
tr[p][x]=id,p=pr[p];
if(p<0){
sm[tl]++;
return;
}int u=p,v=tr[p][x];
if(ln[u]+1==ln[v]){
pr[id]=v;
sm[tl]++;
return;
}cpy(++id,v);
ln[id]=ln[u]+1;
pr[v]=pr[id-1]=id;
while(~p&&tr[p][x]==v)
tr[p][x]=id,p=pr[p];
sm[tl]++;
}void jb(){
for(int i=1;i<=id;i++)
g[pr[i]].push_back(i);
}void dfs(int x){
ll sum=sm[x];
for(int i=0;i<g[x].size();i++){
int y=g[x][i];dfs(y);
ans+=sum*sm[y]*ln[x];
sum+=sm[y];
}sm[x]=sum;
}
}sam;char s[N];int n;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>s;n=strlen(s);
for(int i=n-1;~i;i--)
sam.add(s[i]-'a');
sam.jb();sam.dfs(0);
cout<<(ll)(n-1)*n*(n+1)/2-sam.ans*2;
return 0;
}//man!what can I say!
[AHOI2013] 差异 题解的更多相关文章
- 洛谷 P4248 / loj 2377 [AHOI2013] 差异 题解【后缀自动机】【树形DP】
可能是一个 SAM 常用技巧?感觉 SAM 的基础题好多啊.. 题目描述 给定一个长度为 \(n\) 的字符串 \(S\) ,令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀,求: \[ ...
- BZOJ3238:[AHOI2013]差异——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3238 https://www.luogu.org/problemnew/show/P4248 参考 ...
- 【LG4248】[AHOI2013]差异
[LG4248][AHOI2013]差异 题面 洛谷 题解 后缀数组版做法戳我 我们将原串\(reverse\),根据后缀自动机的性质,两个后缀的\(lcp\)一定是我们在反串后两个前缀的\(lca\ ...
- 【BZOJ3238】[AHOI2013]差异
[BZOJ3238][AHOI2013]差异 题面 给定字符串\(S\),令\(T_i\)表示以它从第\(i\)个字符开始的后缀.求 \[ \sum_{1\leq i<j\leq n}len(T ...
- 【BZOJ3238】[Ahoi2013]差异 后缀数组+单调栈
[BZOJ3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...
- bzoj3238 [Ahoi2013]差异 后缀数组+单调栈
[bzoj3238][Ahoi2013]差异 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Ou ...
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
- bzoj 3238 Ahoi2013 差异
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2357 Solved: 1067[Submit][Status ...
- BZOJ 3238: [Ahoi2013]差异 [后缀自动机]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2512 Solved: 1140[Submit][Status ...
- BZOJ_3238_[Ahoi2013]差异_后缀自动机
BZOJ_3238_[Ahoi2013]差异_后缀自动机 Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sam ...
随机推荐
- QPushButton长度固定,不随文字变化
QPushButton不随text长度变化 设置SizePolicy中的水平策略 没有设置为 忽略
- DDPM论文解读
DDPM(Denoising Diffusion Probabilistic Models) 论文研究背景 扩散概率模型(Denoising Diffusion Probabilistic Model ...
- 覆盖全品类数据,腾讯云COS内容审核全新上线
今年,国家网信办深入推进"清朗·春节网络环境"专项行动.截至3月24日,网信办共累计清理相关违法违规信息208万余条,处置账号7.2万余个,协调关闭.取消备案网站平台2300余家. ...
- IOS获取蓝牙状态
IOS获取蓝牙状态 监听蓝牙状态 在Link Binaries With Libraries中添加CoreBluetooto.framework 创建CBCentralManager对象 为了避免每次 ...
- postgresql序列重复问题处理
问题 在执行数据插入时,postgresql 提示more than one owned sequence found错误.这个和之前文章中写的序列编号错乱不同,是由数据表的一个列生成了多个序列导致的 ...
- Qt/C++音视频开发71-指定mjpeg/h264格式采集本地摄像头/存储文件到mp4/设备推流/采集推流
一.前言 用ffmpeg采集本地摄像头,如果不指定格式的话,默认小分辨率比如640x480使用rawvideo格式,大分辨率比如1280x720使用mjpeg格式,当然前提是这个摄像头设备要支持这些格 ...
- vue3项目中报错:Unexpected mutation of "xxx" prop
vue3 中element 弹窗绑定需要通过v-model,这个时候父级会传个dialogVisible(boolean值)过来,结果会报eslint的错. Unexpected mutation o ...
- IM开发者的零基础通信技术入门(十二):上网卡顿?网络掉线?一文即懂!
[来源申明]本文引用了微信公众号"鲜枣课堂"的<上网慢?经常掉线?这篇文章告诉你该怎么办!>文章内容.为了更好的内容呈现,即时通讯网在引用和收录时内容有改动,转载时请注 ...
- 深入剖析数据删除操作:DELETE 语句的使用与管理实践
title: 深入剖析数据删除操作:DELETE 语句的使用与管理实践 date: 2025/1/8 updated: 2025/1/8 author: cmdragon excerpt: 数据删除( ...
- Solution Set -「NOIP Simu.」20221113
\(\mathscr{A}\sim\) 游戏 Cover:「ARC 087E」Prefix-free Game. Tags:「A.博弈-SG 函数」「A.数据结构-Trie」 想了半天 ( ...