先来个next数组模板
void Next()
{
int i=0,j=-1;
next[0]=-1;
while(i<len)
{
if(s[i]==s[j]||j==-1)
next[++i]=++j;
else
j=next[j];
}
}
首先
1:i-next[i]是最小循环节的长度
2:字符串的循环条件是i%(i-next[i])==0&&next[i]!=0
3:最小循环节的循环次数是i / (i-next[i])
4:整体 在 字符串 s
L= strlen(s)
n = next[l]
L%(L-next[L])==0 有循环节
k = L - n= L - next[L] 最小循环节
1> p = L%k=L%(L-next[L]) 循环k节点若干次后剩余部分的长度
2> q = (k-p)%k =k-q q为字符串s1要想补齐成恰好整数个k所需要的最少字符数
对于1 ababa 没有循环节 next[L]=3 最小循环节L-next[L]=2 则 取余说明 还剩多少节点没有循环 如最后一个a
正对2如果最小循环节减去取余后的 则得到补齐整数时所需的字串