这个做法有问题吗

P4287 [SHOI2011] 双倍回文

PanH @ 2020-05-09 13:53:43

大概思路是做manacher时每一个符合条件的位置看一下前半部分是不是回文,判定方法是在前半部分的中点p判一下d[p]*2==d[i].这个思路有没有问题啊?

交上去之后WA了#1 #3 #8

#include<bits/stdc++.h>
using namespace std;
int len,d[2000005],ans;
char s[2000005];
inline void READ()
{
    len=0;
    s[0]='?',s[++len]='!';
    char ch=getchar();
    while(ch<'a'||ch>'z')   ch=getchar();
    while(ch>='a'&&ch<='z') s[++len]=ch,s[++len]='!',ch=getchar();
}
int main()
{
    cin>>len;
    READ();
//  cout<<s<<endl;
    int r=0,mid=0;
    for(int i=1;i<=len;i++)
    {
        if(i<=r)    d[i]=min(d[(mid<<1)-i],r-i);
        while(s[i+d[i]]==s[i-d[i]]&&i+d[i]<=len&&i-d[i])    d[i]++;
        d[i]--;
        if(r<=i+d[i])   r=i+d[i],mid=i;
        if(s[i]=='!'&&s[i-(d[i]>>1)]=='!')
        {
            int p=i-(d[i]>>1);
            if((d[p]<<1)==d[i]) ans=max(ans,d[i]);
        }
//      cout<<d[i]<<' ';
    }
//  cout<<endl;
    cout<<ans;
    return 0;
}

by Peter3245127684 @ 2020-05-09 14:20:52

%%%ph巨佬


by Peter3245127684 @ 2020-05-09 14:21:26

本菜鸡manacher。。。都不会。。。还在苦苦挣扎KMP。。。


by FZzzz @ 2020-05-09 14:37:34

@panhan i+d[i]<=len&&i-d[i] 是不是要放到 s[i+d[i]]==s[i-d[i]] 前面啊

当然有可能不是这个问题(


by FZzzz @ 2020-05-09 14:37:50

@Peter3245127684 不会就不要回答……


by FZzzz @ 2020-05-09 14:40:27

@panhan 为什么是 i-(d[i]>>1)


by Peter3245127684 @ 2020-05-09 14:40:49

一个机房的,来水水讨论qwq @FZzzz


by PanH @ 2020-05-09 14:59:57

%一下两位大佬


by PanH @ 2020-05-09 15:03:45

@FZzzz i-(d[i]>>1)不是当前求的回文串左边部分的中点吗


by PanH @ 2020-05-09 15:04:18

我想想是这样的qwq


by PanH @ 2020-05-09 15:04:52

(问一句咋写出红色的代码字体啊)


| 下一页