社区讨论
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
#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 条回复,欢迎继续交流。
正在加载回复...