0001 void buildNext(char* P, int m, int* next) { //构造next表(改进版) 0002 for (int t = next[0] = -1, j = 0; j < m-1; ) //从首项为-1起,递推地逐项计算 0003 if (0 <= t && P[t] != P[j]) //若失配 0004 t = next[t]; //则继续尝试下一值得尝试的位置 0005 else //一旦匹配(找到了最长的匹配真前缀P[0,t]=P[j-t,j]),next[j+1]便可确定 0006 if (P[t+1] != P[j+1]) //若不致“二过” 0007 next[++j] = ++t; //则P[t+1]即是P[j+1]的替代者(递增) 0008 else //否则(此时必有P[next[t+1]] != P[t+1] == P[j+1]) 0009 next[++j] = next[++t]; //P[next[t]]即是P[j+1]的替代者(抄袭) 0010 } //buildNext