什么情况!?!?
查看原帖
什么情况!?!?
1065103
Atri_Lobato楼主2024/7/9 21:05

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,逆天

2024/7/9 21:05
加载中...