先來個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如果最小循環節減去取餘後的 則得到補齊整數時所需的字串