
[AHOI2013]差异 【SAM后缀树+树形dp】
发布日期:2021-05-06 15:54:56
浏览次数:31
分类:精选文章
本文共 962 字,大约阅读时间需要 3 分钟。
万能的后缀树啊2333
建出后缀树,一个节点的祖先节点都是他的后缀,一个节点的儿子节点都是以他为后缀的串。所以两个串的lcs就是他们的lca节点的 l e n len len 。
这道题可以对反串建后缀树,树边 ( u , v ) (u,v) (u,v) 权值为 ∣ l e n u − l e m v ∣ |len_u-lem_v| ∣lenu−lemv∣ ,答案就是所有关键点之间的路径权值之和。
#include#define N 1000006using namespace std;typedef long long ll;char s[N];int lst,cnt,link[N];ll n,ans,len[N],siz[N];vector son[N];struct SAM{ map trans[N]; void insert(char c){ int z=++cnt,p=lst; siz[z]=1,len[z]=len[lst]+1; while(p!=-1&&!trans[p].count(c))trans[p][c]=z,p=link[p]; if(p==-1) link[z]=0; else{ int q=trans[p][c]; if(len[q]==len[p]+1) link[z]=q; else{ int clone=++cnt; len[clone]=len[p]+1; trans[clone]=trans[q]; while(p!=-1&&trans[p][c]==q) trans[p][c]=clone,p=link[p]; link[clone]=link[q],link[z]=link[q]=clone; } } lst=z; } void dp(int x=0){ int y; for(int i=0;i =1;i--) sam.insert(s[i]); for(int i=1;i<=cnt;i++) son[link[i]].push_back(i); sam.dp(); cout<
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月11日 18时45分35秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】
2021-05-09
P1379 八数码难题 ( A* 算法 与 IDA_star 算法)
2021-05-09
算法学习笔记: 珂朵莉树
2021-05-09
Codeforces Round #664 题解(A ~ C)
2021-05-09
Problem A - Sequence with Digits (数学推导)
2021-05-09
Problem 330A - Cakeminator (思维)
2021-05-09
LeetCode75 颜色分类 (三路快排C++实现与应用)
2021-05-09
docker基础:容器生命周期管理命令
2021-05-09
C#开发BIMFACE系列35 服务端API之模型对比6:获取模型构建对比分类树
2021-05-09
C# 规范建议
2021-05-09
C语言+easyX图形库的推箱子实现
2021-05-09
反汇编-流程控制语句-2-循环控制语句分析
2021-05-09
调试vs2019代码的流程
2021-05-09
游戏外挂基础-概述
2021-05-09
脱壳与加壳-加壳-6-代码实现加密导入表
2021-05-09
Typora配置PicGo时,提示Failed to fetch
2021-05-09
ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL
2021-05-09
bcolz的新操作
2021-05-09
Linux的s、t、i、a权限(转)
2021-05-09
zmq的send
2021-05-09