BZOJ bzoj1396 识别子串】的更多相关文章

题面: bzoj1396 题解: 先建出SAM,并计算right集合大小.显然符合条件的点的right集合大小为1. 对于每个right集合为1的状态显然可以算出这些状态的pos以及maxlen和minlen(fa的len+1). 然后对于在pos和pos-minlen+1区间内的字符显然必须选长为minlen的一段区间.因此我们搞一棵线段树维护这些minlen,即对于在pos和pos-minlen+1区间内的字符在线段树上和minlen取min 对于另外的在pos-maxlen+1到pos-m…
BZOJ1396 识别子串 给定一个串\(s\),对于串中的每个位置,输出经过这个位置且只在\(s\)中出现一次的子串的最短长度 朴素的想法是,我们要找到那些只出现一次的子串,之后遍历每个串,把串所覆盖的区域区间和串长取\(min\) 考虑优化,根据\(s\)串先建立\(SAM\),然后计算出每个状态的\(endpos\)集合的大小,其中大小为\(1\)的状态所表示的一系列子串必然只在原串中出现一次,对于\(endpos\)大小为\(1\)的某个状态\(u\),其表示的子串的最短长度为\(len…
https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的出现次数就是子树中叶子节点的个数 所以只有叶子节点 即 |Right|=1的状态 代表的子串 出现了1次 我们计算以每一个位置为子串右端点时,它对一些位置的贡献 枚举|Right|=1的状态s 令end=Right(s) 那么以end为子串右端点,长度在[1,Max(parent(s))]的子串至少…
这道题各位大神好像都是用后缀自动机做的?.....蒟蒻就秀秀智商写一写后缀数组解法..... 求出Height数组后, 我们枚举每一位当做子串的开头. 如上图(x, y是height值), Heights数组中相邻的3个后缀, 假如我们枚举s2的第一个字符为开头, 那我们发现, 长度至少为len = max(x, y)+1, 才能满足题意(仅出现一次). 这个很好脑补...因为s2和其他串的LCP是RMQ, 肯定会<=LCP(s1,s2)或<=LCP(s2,s3). 然后就用len去更新s2中…
题目链接 SAM:能成为识别子串的只有那些|right|=1的节点代表的串. 设这个节点对应原串的右端点为r[i],则如果|right[i]|=1,即\(s[\ [r_i-len_i+1,r_i-len_{fa_i} ]\sim r_i\ ]\)这些子串都出现一次. 那么对于[ r[i]-len[i]+1, r[i]-len[fa[i]] ]都可以用此时对应的长度(r-i+1)更新其最小值(这个维护每个位置最小的r就可以). 对于位置[ r[i]-len[fa[i]]+1, r[i] ]可以用l…
Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample Input agoodcookcooksgoodfood Sample Output 1 2 3 3 2 2 3 3 2 2 3 3 2 1 2 3 3 2 1 2 3 4 Solution 1A挺开心的省得调了对于SAM上的每一个节点,我们只需要考虑right集合大小为1的设一个right集合大小为…
后缀自动机+线段树 先建出\(sam\),统计一遍每个点的\(right\)集合大小\(siz\),对于\(siz=1\)的点\(x\),他所代表的子串只会出现一次,设\(y=fa[x]\),则这个点代表的子串即为\((1...len[x]-len[y],len[x])\),对于子串\((len[x]-len[y],len[x])\)的每一个点,这个子串都是他的识别子串,长度固定\(len[y]+1\),而对于一个点\(i\in[1,len[x]-len[y]-1]\),子串\((i,len[x…
题目大意 给定一个长度\(\le100000\)的字符串 求每一个位置的最短识别子串 对于位置\(x\),能识别子串\(s[i...j]\)的条件是 1.\(i\le x \le j\) 2.\(s[i...j]\)在原串中只出现了一次 分析 从第二个条件入手 仅出现一次子串就是后缀树上\(|right|=1\)的子串 考虑贡献 该后缀左端点在\(left\) 长度范围\([L,R]\) 如图 对于\(A\)部分贡献的最短串长度为\(L\) 对于\(B\)部分贡献是等差数列\(i-lef+1\)…
1396: 识别子串 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 381  Solved: 243[Submit][Status][Discuss] Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample Input agoodcookcooksgoodfood Sample Output 1 2 3 3…
Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. Sample Input agoodcookcooksgoodfood Sample Output 1 2 3 3 2 2 3 3 2 2 3 3 2 1 2 3 3 2 1 2 3 4 解题思路: 思考一个最小识别串会带来什么. 在它内部的点的答案就是这个串的长度,而在它外面的点需要拓展到这个串的端点. 首先,一…