这个做法有问题吗
查看原帖
这个做法有问题吗
304995
PanH楼主2020/5/9 13:53

大概思路是做manacher时每一个符合条件的位置看一下前半部分是不是回文,判定方法是在前半部分的中点p判一下d[p]*2==d[i].这个思路有没有问题啊?

交上去之后WA了#1 #3 #8

#include<bits/stdc++.h>
using namespace std;
int len,d[2000005],ans;
char s[2000005];
inline void READ()
{
	len=0;
	s[0]='?',s[++len]='!';
	char ch=getchar();
	while(ch<'a'||ch>'z')	ch=getchar();
	while(ch>='a'&&ch<='z')	s[++len]=ch,s[++len]='!',ch=getchar();
}
int main()
{
	cin>>len;
	READ();
//	cout<<s<<endl;
	int r=0,mid=0;
	for(int i=1;i<=len;i++)
	{
		if(i<=r)	d[i]=min(d[(mid<<1)-i],r-i);
		while(s[i+d[i]]==s[i-d[i]]&&i+d[i]<=len&&i-d[i])	d[i]++;
		d[i]--;
		if(r<=i+d[i])	r=i+d[i],mid=i;
		if(s[i]=='!'&&s[i-(d[i]>>1)]=='!')
		{
			int p=i-(d[i]>>1);
			if((d[p]<<1)==d[i])	ans=max(ans,d[i]);
		}
//		cout<<d[i]<<' ';
	}
//	cout<<endl;
	cout<<ans;
	return 0;
}
2020/5/9 13:53
加载中...