NEXT数组与字符串最小循环节

结论
通过NEXT数组,可以得到字符串的最小循环节。
设字符串s的结尾下标为i,NEXT[i]=j,如果(left{egin{aligned}j e0\i\%(i-j)==0end{aligned} ight.)成立,那么s[j+1,i]就是字符串的最小循环节。

简要说明
————————
1      x  j
  ————————
  y        i

设s[x,j]=s[j,i]
由于s[1,j]=s[y,i],并且
s[1,j]=s[1,x]+s[x,j]
s[y,i]=s[y,j]+s[j,i]
所以s[1,x]=s[y,j]

——————
1      x
  ——————
  y      j
和之前的情况相同。
所以如果字符串是由重复的s[j+1,i]组成的,那么s[j+1,i]就是字符串的循环节。
由于NETX数组的性质,s[j+1,i]也是字符串的最小循环节,因为如果有更小的循环节,NEXT[i]的值也会变大,直到不存在更小的循环节。

相关题目
hdu1358 Period
求每个前缀串的最大周期。
hdu3746 Cyclic Nacklace
最少在字符串头尾添加几个字符,使得从开头到某个位置和从某个位置到结尾的两段字符相同,并且两段字符无重叠部分。

原文地址:https://www.cnblogs.com/fxq1304/p/13222374.html