char str1[1010];
char str2[1010];
int Next[1010];
void next_arr()
{
int len = strlen(str2);
Next[0] = -1;
int k = -1;
int j = 0;
while (j < len - 1)//这个减一好像写不写都行,我看被人都没写
{
if (k == -1 || str2[j] == str2[k])
{
++k;
++j;
Next[j] = k;
}
else
k = Next[k];
}
}
int kmp_match()
{
next_arr();
int i=0,j=0;
int len1=strlen(str1);
int len2=strlen(str2);
while(i<len1&&j<len2){
if(j==-1||str1[i]==str2[j]){
i++;
j++;
}
else
j=Next[j];
}
if(j == len2)
return i - j;
return -1;
}
求子串个数
char str1[1000008];
char str2[1000008];
int Next[1000008];
int ans;
void next_arr(){
int len = strlen(str2);
Next[0] = -1;
int k = -1;
int j = 0;
while (j < len)//这里改了
{
if (k == -1 || str2[j] == str2[k])
{
++k;
++j;
Next[j] = k;
}
else
k = Next[k];
}
}
int kmp_match(){
next_arr();
int i=0,j=0;
int len1=strlen(str1);
int len2=strlen(str2);
while(i<len1){
if(j==-1||str1[i]==str2[j]){
i++;
j++;
}
else
j=Next[j];
if(j == len2){//这里改了
ans++;
j=Next[j];
}
}
return -1;
}
int main(){
ans=0;
}