//next数组中的值val有两种情况:
//1、val=-1;此时意味着主串和子串的下标都需要加1;
//2、val={0,1...k-1}中的任意值,k为正在比较的第k个字符,也就是说当他们不相等时,需要回溯到val继续比较;
void get_next(char *p,int n) {
int i=0,k;
k=next[0]=-1;//k表示当前i字符的next值,利用i求i+1的next
while(i<n) {
if(k==-1||p[i]==p[k]) {
k++,i++;
next[i]=k;//但是当i+1与他的next值对应的字符相等时,我们需要继续改进next[i]=next[k];
} else k=next[k];
}
}
void get_nextval(char *p,int n) {
int i=0,k;
k=next[0]=-1;//k表示当前i字符的next值,利用i求i+1的next
while(i<n) {
if(k==-1||p[i]==p[k]) {
k++,i++;
if(p[i]==p[k]) next[i]=next[k];
else next[i]=k;
} else k=next[k];
}
}