这样一份代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1e6+105;
char s1[N],s2[N];
int nxt[N];
void kmp(char*s,int*next){
int n=strlen(s+1);
next[0]=-1;
for(int i=1;i<=n;i++){
int k=next[i-1];
while(k!=-1&&s[k+1]!=s[i])k=next[k];
next[i]=k+1;
}
}
int main(){
scanf("%s%s",s1+1,s2+1);
kmp(s2,nxt);
int l1=strlen(s1+1),l2=strlen(s2+1);
int ans=0;
for(int i=0,j=0;i<=l1;){
while(s1[i+1]!=s2[j+1]){//这一行应该为while(s1[i+1]!=s2[j+1]&&i<=l1){
if(j==0)i++;//RE原因:可能i无限加下去越界
else j=nxt[j];
}
while(s1[i+1]==s2[j+1]&&i<l1&&j<l2)i++,j++;
if(j==l2)ans++,j=nxt[j];
}
printf("%d\n",ans);
return 0;
}
可是在线ide 和本地(win) 测评测数据都没RE,评测RE.
why?