//通過計算返回子串T的next數組
void get_next(String T, int next[])
{
next[1] = 0;
int m, j;
m = 0; //m=next[1], m代表的是前綴結束時的下標,也就是相似度,是等價的 T1T2...Tm(m個字符)
j = 1; //j 代表的是后綴末尾的下標, Tj-m+1..Tj(m個字符) 其實j就是后綴的下標,而 ++j后 就是我們要求的next數組下標next[j]。
while (j < T.length)
{ //這個if,我們只需要考慮,如果我<后綴最后下標>前面匹配成功,現在我T[j]==T[m]也匹配成功,那么我對應的 next[++j] 數組值是多少?
if (m == 0 || T[m] == T[j]) //T[m]表示前綴的最末尾字符,T[j]是后綴的最末尾字符
{
++m;
++j;
next[j] = m; //++j后獲取的才是我們要的next[j]下標,我們要獲取next[j]處的值; m++后的m才是我們想要給next[j]賦的值,前綴有m個字符,下輪j就要讓T(m+1)和Si比較。
}
else //else是匹配失敗的情況,就要進行回溯
m = next[m]; //若是字符不相同,則m回溯
}
}