标准代码
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int next[1000005];
char s[1000005];
char t[1000005];
int ans[1000005];
int main()
{
scanf("%s%s",t+1,s+1);
int ls=strlen(s+1);
int lt=strlen(t+1);
int k=0;
next[1]=0;
for(int i=2;i<=ls;i++)
{
while(k!=0&&s[i]!=s[k+1])
k=next[k];
if(s[i]==s[k+1])k++;
next[i]=k;
}
k=0;
int num=0;
for(int i=1;i<=lt;i++)
{
while(k!=0&&t[i]!=s[k+1])
k=next[k];
if(t[i]==s[k+1])k++;
if(k==ls)
{
num++;
ans[num]=i-ls+1;
}
}
for(int i=1;i<=num;i++)
printf("%d\n",ans[i]);
for(int i=1;i<=ls;i++)
printf("%d ",next[i]);
return 0;
}
我的代码
我的代码它有点沙雕
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>;
using namespace std;
int a[1000010],next[1000010];
string s,t;
int main()
{
cin>>s;
cin>>t;
s=' '+s;
t=' '+t;
int i=0,j=0;
next[i]=-1;
for (int i=1; i<=t.size()-1; i++)
{
while (j>0&&t[j+1]!=t[i+1])
j=next[j];
if (t[j+1]==t[i+1]) j++;
next[i+1]=j;
}
j=1;
for (int i=1; i<=s.size()-1; i++)
{
while (j>1&&t[j+1]!=s[i+1])
j=next[j];
if (t[j+1]==s[i+1]) j++;
if (j==t.size()-1)
{
cout<<i+1-t.size()+1+1<<endl;
j=next[j];
}
}
for (int i=1; i<=t.size()-1; i++)
cout<<next[i]<<' ';
}