马拉车(manacher)WA2个点,83分求助

P4287 [SHOI2011] 双倍回文

qinshi0308 @ 2024-08-31 23:11:11

在#6和#12WA\ 评测记录

# include <bits/stdc++.h>
using namespace std;
long long d1[500010],d2[500010];
int main(){
    int n;
    string s;
    cin>>n>>s;
    for(int i=0,l=0,r=-1;i<n;i++){
        int k=(i>r?1:min(d1[l+r-i],r-i+1ll));
        while(i-k>=0&&i+k<n&&s[i-k]==s[i+k]){
            k++;
        }
        d1[i]=k--;
        if(i+k>r){
            l=i-k;
            r=i+k;
        }
    }
    for(int i=0,l=0,r=-1;i<n;i++){
        int k=(i>r?0:min(d2[l+r-i+1],r-i+1ll));
        while(i-k-1>=0&&i+k<n&&s[i-k-1]==s[i+k]){
            k++;
        }
        d2[i]=k--;
        if(i+k>r){
            l=i-k-1;
            r=i+k;
        }
    }
    long long ans=0;
    for(int i=0;i<n;i++){
        long long d2i_=d2[i];
        while(d2i_){
            if(d2i_%2==0){
                int a=i-d2i_/2;
                int b=i+d2i_/2;
                if(d2[a]*2>=d2i_&&d2[b]*2>=d2i_){
                    ans=max(ans,d2i_*2);
                    break;
                }
            }else{
                int a=i-d2i_/2-1;
                int b=i+d2i_/2;
                if(d1[a]*2-1>=d2i_&&d1[b]*2-1>=d2i_){
                    ans=max(ans,d2i_*2);
                    break;
                }
            }
            d2i_--;
        }
    }
    cout<<ans;
    return 0;
} 

by qinshi0308 @ 2024-08-31 23:13:14

讨论区的几个hack都试了一遍,没问题


by _Yonder_ @ 2024-08-31 23:37:45

马拉车是这样写的吗?隔开相邻字符的特殊符号在哪里?


by qinshi0308 @ 2024-09-01 16:16:12

没事了,题目漏看了一点(


by qinshi0308 @ 2024-09-01 16:16:47

@Yonder 这样写是没问题的,可以不用特殊符号


|