结论
通过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
最少在字符串头尾添加几个字符,使得从开头到某个位置和从某个位置到结尾的两段字符相同,并且两段字符无重叠部分。