题意:给一个字符串,对于每个位置i,求出最短满足的子串[l,r]使得i∈[l,r]且这个子串只出现一次,输出这个子串的长度
神(shui)题,AC后看了下别人的code发现全都是后缀数组(难看)
可能是因为我太弱了所以只想到SAM的算法
做法:建立SAM,求出parent树,预处理倍增,让后就可以O(lg n)查询一个字串的出现次数了
接下来,我们对于每个l∈[1,n],我们求出一个最小的r使得[l,r]在整个串里面只出现一次
那么对于每个点i,ans[i]有两种情况:
1.i被一个最短的区间[lj,rj]覆盖,那么我们可以
把这些l,r区间按长度从大到小排序,并且用线段树区间覆盖
2.有可能是一个区间[lj,rj](rj<i)的延伸[lj,i]
对于这种情况