TLE,3个
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[1000005];
char s2[1000005];
int p2[1000005];
void pre(int len)
{
p2[1]=0;
int q=p2[1];
for(int i=1;i<=len;i++)
{
while(q>0&&s2[i+1]!=s2[q+1])
{
q=p2[q];
}
if(s2[i+1]==s2[q+1])
{
q++;
}
p2[i+1]=q;
}
}
int main()
{
scanf("%s",s1+1);
scanf("%s",s2+1);
pre(strlen(s2+1));
int q=0;
for(int i=0;i<strlen(s1+1);i++)
{
while(q>0&&s1[i+1]!=s2[q+1])
{
q=p2[q];
}
if(s1[i+1]==s2[q+1])
{
q++;
}
if(q==strlen(s2+1))
{
printf("%d\n",i+1-q+1);
q=p2[q];
}
}
for(int i=1;i<=strlen(s2+1);i++)
{
cout<<p2[i]<<' ';
}
return 0;
}
看了眼讨论版,改成
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[1000005];
char s2[1000005];
int p2[1000005];
void pre(int len)
{
p2[1]=0;
int q=p2[1];
for(int i=0;i<len;i++)
{
while(q>0&&s2[i+1]!=s2[q+1])
{
q=p2[q];
}
if(s2[i+1]==s2[q+1])
{
q++;
}
p2[i+1]=q;
}
}
int main()
{
scanf("%s",s1+1);
scanf("%s",s2+1);
pre(strlen(s2+1));
int l1=strlen(s1+1);
int l2=strlen(s2+1);
int q=0;
for(int i=0;i<l1;i++)
{
while(q>0&&s1[i+1]!=s2[q+1])
{
q=p2[q];
}
if(s1[i+1]==s2[q+1])
{
q++;
}
if(q==l2)
{
printf("%d\n",i+1-q+1);
q=p2[q];
}
}
for(int i=1;i<=l2;i++)
{
cout<<p2[i]<<' ';
}
return 0;
}
全T,逆天