蒟蒻manacher92pts求助

P4287 [SHOI2011] 双倍回文

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


| 下一页