30分求调
查看原帖
30分求调
319512
章鱼姐楼主2023/10/3 23:07
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000010
char a[MAXN],b[MAXN];
int next1[MAXN];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int main()
{
	cin>>a+1;
	cin>>b+1;
	int a1=strlen(a+1);
	int b1=strlen(b+1);
	for(int i=2;i<=b1;i++)
	{
		int u=i;
		while(next1[u-1]!=0)
		{
			if(b[next1[u-1]+1]==b[i])
			{
				next1[i]=max(next1[i],next1[u-1]+1);
			}
			u=next1[u-1]+1;
			//cout<<u<<endl;
		}
		if(next1[i]==0)
		{
			if(b[i]==b[1])
			{
				next1[i]++;
			}
		}
	}
	int j=1,i=1;
	for(i=1;i<=a1;i++)
	{
		if(a[i]!=b[j]&&j>1)
		{
			j=next1[j-1]+1;
		}
		if(j==b1)
		{
			//cout<<i<<" ";
			cout<<i-j+1<<endl;
			j=next1[j];
		}
		j++;
	}
	for(i=1;i<=b1;i++)
	{
		cout<<next1[i]<<" ";
	}
	return 0;
 } 
2023/10/3 23:07
加载中...