下两代码中均有
n=strlen(p+1);
这一语句,但在最后输出的时候
for(int i=1;i<=n;i++)
与
for(int i=1;i<=strlrn(p+1);i++)
输出效果是时间上的差异
代码1(subtask3TLE)
#include<iostream>
#include<string.h>
using namespace std;
const int mx=1e6+10;
char t[mx],p[mx];
int nxt[mx],n,m;
int main() {
scanf("%s%s",t+1,p+1);
n=strlen(p+1), m=strlen(t+1);
nxt[1]=0;
for(int i=2,k=0;i<=n;i++){
while(k&&p[i]!=p[k+1]) k=nxt[k];
if(p[i]==p[k+1]) k++;
nxt[i]=k;
}
for(int i=1,k=0;i<=m;i++){
while(k&&t[i]!=p[k+1]) k=nxt[k];
if(t[i]==p[k+1]) k++;
if(k==n) printf("%d\n",i-k+1), k=nxt[k];
}
for(int i=1;i<=strlen(p+1);i++)printf("%d ",nxt[i]);
return 0;
}
code 2(AC)
#include<iostream>
#include<string.h>
using namespace std;
const int mx=1e6+10;
char t[mx],p[mx];
int nxt[mx],n,m;
int main() {
scanf("%s%s",t+1,p+1);
n=strlen(p+1), m=strlen(t+1);
nxt[1]=0;
for(int i=2,k=0;i<=n;i++){
while(k&&p[i]!=p[k+1]) k=nxt[k];
if(p[i]==p[k+1]) k++;
nxt[i]=k;
}
for(int i=1,k=0;i<=m;i++){
while(k&&t[i]!=p[k+1]) k=nxt[k];
if(t[i]==p[k+1]) k++;
if(k==n) printf("%d\n",i-k+1), k=nxt[k];
}
for(int i=1;i<=n;i++)printf("%d ",nxt[i]);
return 0;
}