BZOJ-1396: 识别子串】的更多相关文章

这道题各位大神好像都是用后缀自动机做的?.....蒟蒻就秀秀智商写一写后缀数组解法..... 求出Height数组后, 我们枚举每一位当做子串的开头. 如上图(x, y是height值), Heights数组中相邻的3个后缀, 假如我们枚举s2的第一个字符为开头, 那我们发现, 长度至少为len = max(x, y)+1, 才能满足题意(仅出现一次). 这个很好脑补...因为s2和其他串的LCP是RMQ, 肯定会<=LCP(s1,s2)或<=LCP(s2,s3). 然后就用len去更新s2中…
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…
题目链接 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…
题目大意 给定一个长度\(\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\)…
手动博客搬家: 本文发表于20181221 00:58:26, 原地址https://blog.csdn.net/suncongbo/article/details/85150962 嗯,以后博客内容就这样规定吧: 近期,以下三类题目做完之后必须写题解,其他的任意 数学.字符串.网络流 好了进入正题 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1396 题目大意: 给定长度为\(n\)的字符串\(a\), 对每一个\(i\in […
题链: http://www.joyoi.cn/problem/tyvj-2301(非权限OI患者,苟且在joyoi...)题解: 后缀自动机,线段树 先对原串建立后缀自动机,不难发现, 会影响答案是那些right集合大小恰好为1的状态. 考虑这些状态是如何影响答案的. 对于一个right集合大小为1的状态s, 令其允许的最大长度为maxs[s],其允许的最小长度为maxs[parent[s]]+1,其right集合里唯一的元素是minr(这里minr表示该状态对应的串在该位置结束) 我们可以得…
根据height数组的定义,和当前后缀串i最长的相同串的长度就是max(height[i],height[i+1]),这个后缀贡献的最短不同串长度就是len=max(height[i],height[i+1]) 考虑这个贡献的范围,对于i~i+len,贡献是len,对于w=i+len+1~n可以更新w-len+1,也就是这长为len的串再向右延伸,可以证明这也是不重子串 这两个东西用两个线段树维护,w-len+1这个直接把-len+1打在线段树上,查询的时候再加回w即可 #include<ios…
题目大意: 给你一个字符串S,求关于每个位置x的识别串T的最短长度,T必须满足覆盖x,且T在S中仅出现一次 神题 以节点x为结尾的识别串,必须满足它在$parent$树的子树中只有一个$endpos$节点 若令$fa=pre_{x},L=dep_{fa},R=dep_{x}$ 1.对于以$i\in[1,R-L]$为开头,以$R$为结尾的串,合法串的长度是$R-i+1$ 如果在$S_{1...x}$串中不断删去开头的字符,删到串剩余长度为$dep_{fa}$时结束 上述过程在$parent$树里的…
建个SAM,符合要求的串显然是|right|==1的节点多代表的串,设si[i]为right集合大小,p[i]为right最大的r点,这些都可以建出SAM后再parent树上求得 然后对弈si[i]==1的点,考虑它所代表的串是s(p[i]-dis[i]+1,p[i])~s(p[i]-dis[fa[i]],p[i]),然后对于p[i]-dis[i]+1<=x<=p[i]-dis[fa[i]],对x的答案的贡献是p[i]-x+1,带着-x不好做所以最后再-x,也就是贡献p[i]+1:对于p[i]…
题面: 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…