77pts__WA#12#13求解答
查看原帖
77pts__WA#12#13求解答
551417
CommonDigger楼主2023/12/26 20:20

参考了第一篇题解,最后两个点WA了

第十二个点输入是ahaaha,我代码输出33(好像ll和rr没弄对?)

提交记录

#include "iostream"
using namespace std;
char a[200005];
int len=0, p[200005], l[200005], r[200005], res=0;
inline void read(){
    char ch=getchar();
    while(ch>='a' && ch<='z'){
        if(len%2==0) a[len++]='#';
        else{
            a[len++]=ch;
            ch=getchar();
        }
    }
    a[len]='#';
    a[len+1]='~';
}
void manacher(){
    int id=0, mx=0;
    for(int i=0;i<=len;i++){
        if(mx>i) p[i]=min(p[2*id-i], mx-i);
        else p[i]=1;
        while(a[i+p[i]]==a[i-p[i]]) p[i]++;
        if(i+p[i]>mx) mx=i+p[i], id=i;
        l[i-p[i]+1]=max(l[i-p[i]+1], p[i]-1);
        r[i+p[i]-1]=max(r[i+p[i]-1], p[i]-1);
    }
}
int main(){
    read();
    manacher();
    for(int i=len;i>=0; i-=2) r[i] = max(r[i], r[i + 2] - 2);
    for(int i=0; i<=len; i+=2) l[i] = max(l[i], l[i - 2] - 2);
    for(int i=0;i<=len;i+=2){
        res=max(res, l[i]+r[i]);
    }printf("%d\n", res);
//    cout << a << "\n";
//    cout << "p[]";
//    for(int i=0;i<=len;i++) printf(" %2d", p[i]);
//    cout << "\nl[]";
//    for(int i=0;i<=len;i++) printf(" %2d", l[i]);
//    cout << "\nr[]";
//    for(int i=0;i<=len;i++) printf(" %2d", r[i]);
//    cout << "\nans=max(ans, r[i]+l[i])";
}
2023/12/26 20:20
加载中...