Luogu P5284 [十二省联考2019]字符串问题
Posted cjoiershiina-mashiro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P5284 [十二省联考2019]字符串问题相关的知识,希望对你有一定的参考价值。
Link
(u)支配(v)则连边(A_u
ightarrow B_v)。
若(B_u)是(A_v)的前缀则连边(B_u
ightarrow A_v)。
那么我们要求的就是这张图的点权最长路,拓扑排序+dp即可。
考虑如何优化建图。
先建出反串的SAM。
然后对于给定的子串(s_{l,r}),parent树上倍增找到它在SAM中的出现位置,然后把这个子串挂在SAM的这个点上。
注意到SAM上一个节点中的字符串在反串中互为后缀,因此它们在原串中互为前缀。
那么我们以结束位置为第一关键字,是否为(A)类子串(是为(1),不是为(0))为第二关键字对每个节点上的子串降序排序。
这样每一个(B)子串类子串要连向的就是这个节点上排在它后面的(A)类子串。
注意到我们要求的是最长路,因此只需要向后面第一个(A)类子串连边即可。
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
#include<algorithm>
namespace IO
{
char ibuf[(1<<26)+1],*iS=ibuf;
void In(){fread(ibuf,1,1<<26,stdin);}
int read(){int x=0;while(!isdigit(*iS))++iS;while(isdigit(*iS))(x*=10)+=*iS++&15;return x;}
void gets(char*s){while(isspace(*iS))++iS;while(islower(*iS))*s++=*iS++;*s='