Skyjoy @ 2020-05-04 19:35:57
WA了第二个点qwq,调了好久了
代码:
#include<bits/stdc++.h>
#define N 1000010
using namespace std;
int n,f[N],ans;
char s[N];
void manacher(int x){
int mid=0,maxn=0;
for(int i=1;i<=x;i+=2){
f[i]=(maxn>i)?min(f[2*mid-i],maxn-i):1;
if(maxn>i&&i-f[i]<mid){
ans=max(ans,2*(i-mid));
}
while(s[i+f[i]]==s[i-f[i]]){
f[i]++;
}
if(f[i]+i>maxn){
mid=i,maxn=f[i]+i;
}
}
}
int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x;
}
int main(){
n=read();
scanf("%s",s+1);
s[1]='$';
for(int i=n;i;i--){
s[i*2+1]='$',s[i*2]=s[i];
}
manacher(2*n);
printf("%d",ans);
return 0;
}
by Semsue @ 2020-05-04 21:04:01
@Skyjoy 这题不是PAM吗
by metaphysis @ 2020-05-05 10:51:55
@Skyjoy
您的解题逻辑存在问题,对于以下输入:
8
abbaabba
您的代码输出:
0
但根据题意,应该输出:
8
by 7919_144_5237 @ 2020-05-05 11:12:12
@Skyjoy 将
while(s[i+f[i]]==s[i-f[i]]){
f[i]++;
}
放到
if(maxn>i&&i-f[i]<mid){
ans=max(ans,2*(i-mid));
}
前面
可以过了上面的那组数据QwQ
by 7919_144_5237 @ 2020-05-05 11:18:37
还有,qndjr
by Skyjoy @ 2020-05-05 11:26:34
@4elkc1707 orz
by Skyjoy @ 2020-05-05 11:28:15
@metaphysis 大佬,看了您的用户名,您是学生物竞赛的吗?
by Skyjoy @ 2020-05-05 11:34:54
@4elkc1707 可是照你这么搞分更低了
by metaphysis @ 2020-05-05 12:06:18
@Skyjoy
有点关系吧,应该说。等会我再看看您的代码。
by metaphysis @ 2020-05-05 13:14:20
@Skyjoy
还是有问题。对于以下输入:
8
aaaaaaaa
您的代码输出:
4
正确输出应该是:
8
by 7919_144_5237 @ 2020-05-05 13:54:53
这一组hack用我说的那样改也能过嗷但是为什么更低分的QAQ