首页 > TAG信息列表 > BZOJ1396

[BZOJ1396] 识别子串 - 后缀自动机,线段树

Description 问字符串 \(S\) 每一位的最短识别子串是多长(识别子串指包含这个字符且只出现在 \(S\) 中一次的子串)。 Solution 首先建出 SAM,由于我们要求出现次数为 \(1\),只有 \(endpos\) 集合大小为 \(1\) 的那些结点有贡献 满足这个条件的结点所表示的串的集合一定是 \([i,pos]\),

【BZOJ1396/2865】识别子串(SAM)(线段树)

传送门 题解: 建出SAM,能够用来更新答案的是right集合大小为1的,也就是叶子节点,也就是原串的每个位置的代表节点。 考虑节点iii,显然[len[fa[i]]+1,len[i]][len[fa[i]]+1,len[i]][len[fa[i]]+1,len[i]]这段区间可以直接被len[fa[i]]+1len[fa[i]]+1len[fa[i]]+1更新。 然后对于

[bzoj1396]识别子串

题面: 看起来有点吓人实则不然 用SA或是SAM都可以过 SAM做法: (哪天有空再补) SA做法: 求完SA之后,对于每一个后缀$i$ 以这个后缀为起点的最短唯一子串长度应该是$max(hei[i],hei[i+1])+1$ 之后用线段树覆盖对应区间就行 ⑨:Baka Baka~ 当然如果一个后缀为起点没有唯一子串的要特判一下

[BZOJ1396] 识别子串

Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Solution 建后缀自动机。 对于每个\(sz\)为\(0\)的点可以造成两段贡献,一段直线,一段斜率为\(-1\)的斜线。 水平的线直接线段树