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

结论
通过NEXT数组,可以得到字符串的最小循环节。
设字符串s的结尾下标为i,NEXT[i]=j,如果\(\left\{\begin{aligned}j\ne0\\i\%(i-j)==0\end{aligned}\right.\)成立,那么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]就是字符串的循环节。
由于NEXT数组的性质,s[j+1,i]也是字符串的最小循环节,因为如果有更小的循环节,NEXT[i]的值也会变大,直到不存在更小的循环节。

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

posted @ 2020-07-01 23:43  fxq1304  阅读(198)  评论(0编辑  收藏  举报