//通过计算返回子串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回溯
}
}