Description 在这个问题中,给定一个字符串S,与一个整数K,定义S的子串T=S(i, j)是关于第K位的识别子串,满足以下两个条件: 1.i≤K≤j. 2.子串T只在S中出现过一次. 例如,S="banana",K=5,则关于第K位的识别子串有"nana","anan","anana","nan","banan"和"banana". 现在,给定S,求对于S的…
水水的字符串题 ~ #include <map> #include <cstdio> #include <cstring> #include <algorithm> #define M 500003 #define N 1000003 #define lson now<<1 #define rson now<<1|1 #define inf 1000000000 #define setIO(s) freopen(s".in&…
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   出现只有一次的是parent数上的叶子节点,endpos=1 所以只需要找endpos=1的节点minlen-maxlen之间对于一段的贡献放向去思…
题意 题目链接 Sol 后缀自动机+线段树 还是考虑通过每个前缀的后缀更新答案,首先出现次数只有一次,说明只有\(right\)集合大小为\(1\)的状态能对答案产生影响 设其结束位置为\(t\),代表的最短/最长后缀的位置为\(l, r\)(l在r的右边) 那么对于区间\(r - l\)内的\(x\)位置,可以用\(t - x+1\)更新答案 对于区间\(l - t\)内的位置,可以用\(l\)更新答案 这两种情况不好一起弄(因为第一种情况肯定要把\(x\)提出来),那么直接开两棵线段树就行了…
题目大意: 给你一个字符串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$树里的…
题意: Description Input 一行,一个由小写字母组成的字符串S,长度不超过10^5 Output L行,每行一个整数,第i行的数据表示关于S的第i个元素的最短识别子串有多长. 题解: 先建出SAM,显然right集合大小为1的子串,即在parent树上的叶子节点可以作为识别子串: 考虑一个这样的子串会对哪些区间产生影响: 设$l=max[fa[s]]$,$r=max[s]$,显然这个子串出现的位置就是$r$,所以对区间$[1,r]$都有影响: 但是其中有一段是被$fa[s]$包含…
传送门 卡空间差评! 题意简述:给一个字串,对于每个位置求出经过这个位置且只在字串中出现一次的子串的长度的最小值. 解法:先建出samsamsam,显然只有当sizep=1size_p=1sizep​=1的时候才对答案有贡献. 于是对于每个sizep=1size_p=1sizep​=1的状态分情况更新答案. pos=[pos[p]−len[link[p]]+1,pos[p]]pos=[pos[p]-len[link[p]]+1,pos[p]]pos=[pos[p]−len[link[p]]+1,…
这道题各位大神好像都是用后缀自动机做的?.....蒟蒻就秀秀智商写一写后缀数组解法..... 求出Height数组后, 我们枚举每一位当做子串的开头. 如上图(x, y是height值), Heights数组中相邻的3个后缀, 假如我们枚举s2的第一个字符为开头, 那我们发现, 长度至少为len = max(x, y)+1, 才能满足题意(仅出现一次). 这个很好脑补...因为s2和其他串的LCP是RMQ, 肯定会<=LCP(s1,s2)或<=LCP(s2,s3). 然后就用len去更新s2中…
这个不是题解,看不懂的,别看了 明明应该是会的,怎么还是写了6个小时呢... 把后缀数组.height数组.排名数组求出来,那么对于原串s的任意子串[x,y](表示第x个到第y个字符组成的子串,字符从1开始编号),就有了O(1)判断其在原串中出现次数是否大于1的方法 bool more1(int x,int y) { ?height[rk[x]]:-,t2=rk[x]<n?height[rk[x]+]:-; ||t2>=y-x+; } 就是找到x在后缀数组中的排名rk[x],再找到后缀sa[r…
https://www.lydsy.com/JudgeOnline/problem.php?id=2865 同上一篇博客 就是卡卡空间,数组改成map #include<map> #include<cstdio> #include<cstring> #include<algorithm> #define N 500001 using namespace std; char s[N]; map<]; ; ],len[N<<]; ]; ,p,q…