社区讨论

0分,#1~3WA其它TLE,求调

P3805【模板】Manacher参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjhwvb9
此快照首次捕获于
2025/11/04 02:50
4 个月前
此快照最后确认于
2025/11/04 02:50
4 个月前
查看原帖
以下是我自己造的错误样例:
样例1
输入:aab
正确输出:2
程序输出:1
样例2
输入:baa
正确输出:2
程序输出:1
样例3
输入:abccb
正确输出:4
程序输出:3
CPP


#include <iostream>
#include <cstring>
using namespace std;
const int N=2.2*1e7+10;
char a1[N],a[N];
int R=1,C=1;
int p[N];
int main()
{
	for(int i=1;i<=N;i++)
	{
		p[i]=1;
	}
	cin>>(a1+1);
	int n=1;
	a[n]='#';
	for(int i=1;i<=strlen(a1+1);i++)
	{
		a[++n]=a1[i];
		a[++n]='#';
	}
	for(int i=1;i<=n;i++)
	{
//		cout<<"for-loop---------"<<"i="<<i<<",a[i]="<<a[i]<<",R="<<R<<",C="<<C<<'\n';
		if(i>=R)
		{
			while(i+p[i]<=n&&i-p[i]>=1&&a[i+p[i]]==a[i-p[i]])
			{
				p[i]++;
				if(i+p[i]>=R)
				{
					R=i+p[i];
					C=i;
				}
			} 
		}
		else
		{
			int ii=C-i+C;
			if(ii<1||ii>n)
			{
				p[i]=R-i;
				continue;
			} 
			if(p[ii]<R-i)
			{
				p[i]=p[ii];
			}
			else
			{
				p[i]=R-i;
				while(i+p[i]<=n&&i-p[i]>=1&&a[i+p[i]]==a[i-p[i]])
				{
					p[i]++;
					if(i+p[i]>=R)
					{
						R=i+p[i];
						C=i;
					}
				}
			} 
		}
	}
	int ans=(R-C)*2-1;
	if(a[C]=='#')
	{
		cout<<ans<<' '<<ans-1-(R-C)<<'\n';
	}
	else
	{
		cout<<ans<<' '<<ans-(R-C)<<'\n';
	}
	
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...