社区讨论

51wa求条

P4555[国家集训队] 最长双回文串参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlhp9p3q
此快照首次捕获于
2026/02/11 15:20
4 周前
此快照最后确认于
2026/02/11 16:05
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
using ll=long long;

const int N=3e5+10;

string s;
string t="#";
ll id,r,mx,idx;
ll n,mir;
ll p[N],l[N],rr[N];

int main()
{
    ios;

    cin>>s;

    for(char c:s)
    {
        t+=c;
        t+='#';
    }
    n=t.length();

    for(int i=0;i<n;i++)
    {
        mir=2*id-i;
        if(i<=r)p[i]=min(r-i,p[mir]);
        else p[i]=1;
        while(i-p[i]>=0&&i+p[i]<n)
        {
            if(t[i+p[i]]==t[i-p[i]])p[i]++;
            else break;
        }
        if(i+p[i]>r)
        {
            id=i;
            r=i+p[i];
        }
        l[i+p[i]-1]=max(l[i+p[i]-1],p[i]-1);
        rr[i-p[i]+1]=max(rr[i-p[i]+1],p[i]-1);
    }

    for(int i=2;i<n;i++)rr[i]=max(rr[i],rr[i-2]-1);
    for(int i=n-3;i>=0;i--)l[i] = max(l[i],l[i+2]-1);

    for(int i=1;i<n-1;i+=2)mx=max(mx,l[i-1]+rr[i+1]);

    cout<<mx;
    
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...