再继续字符串匹配的过程中,为什么
j = len_next[j - 1];
是可行的?
完整代码如下:
( i,j的定义均 " 向后移 " 了一位 )
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;
int len_next[MAXN];
int lena,lenb,i,j,ans_tot;
string s1,s2;
void pre(){
len_next[0] = 0;
int len_n = 0;
i = 1;
while(i < lenb){
if(s2[i] == s2[len_n]){
len_n++;
len_next[i] = len_n;
i++;
}else{
if(len_n == 0){//
len_next[i] = 0;
i++;
}else{
len_n = len_next[len_n - 1];
//len_n = len_next[len_next[i - 1] - 1]; 会超时
//len_n = len_next[next[i - 1]]; 错误写法
}
}
}
return;
}
void slove(){
i = 0,j = 0;
while(i < lena){
if(s1[i] == s2[j]){
i++;
j++;
}else if(j > 0){
j = len_next[j - 1];
}else{
i++;
}
if(j == lenb){//
printf("%d\n",i - j + 1);//
// i = i - lenb + 1;//i = i - lenb + 2;
// j = 0;//错误?严重超时
j = len_next[j - 1];//????????? 为什么这个是正确的 ??????????
}
}
return;
}
int main(){
cin>>s1>>s2;
lena = s1.length();
lenb = s2.length();
pre();
slove();
for(int c=0;c<lenb - 1;c++) printf("%d ",len_next[c]);
printf("%d",len_next[lenb - 1]);
return 0;
}