84pts,1WA1TLE,求助
查看原帖
84pts,1WA1TLE,求助
215590
Ckger楼主2021/7/26 18:19

manacher做法,自己找不出问题了,求助

#include<bits/stdc++.h>
#define foir(i,l,r) for (register int i=l;i<=r;++i)
#define fopr(i,l,r) for (register int i=l;i>=r;--i)
#define maxn 5000010
using namespace std;

int n;
char s[maxn<<1];
int p[maxn<<1];
int mid,r;
int ans;

inline void init()
{
	cin>>n;
	foir(i,1,n)
	{
		cin>>s[i*2-1];
		s[i*2]='#';
	}
	s[0]='#';
	n=n*2-1;
}

int main()
{
	init();
	foir(i,1,n)
	{
		if (i<=r) p[i]=min(r-i+1,p[mid*2-i]);
		while (i-p[i]>=0&&i+p[i]<=n+1&&s[i-p[i]]==s[i+p[i]]) ++p[i];--p[i];
		
		if (i+p[i]>r)
		{
			if (i%2==0)
				for (register int j=2;j<=(p[i]+4)/2;j+=2)
					if (p[i-j]==j)
						ans=max(ans,j*2);
			mid=i,r=i+p[i];
		}
	}
	cout<<ans<<endl;
	return 0;
}
2021/7/26 18:19
加载中...