Submission #309854

#TimeUsernameProblemLanguageResultExecution timeMemory
309854qiangbaoPalinilap (COI16_palinilap)C++98
100 / 100
84 ms25852 KiB
#include <iostream>

using namespace std;

typedef long long ll;

const ll P=31;
const ll MOD=1000000007;

ll n;
string s;

ll inc[100001][27];
ll decr[100001];
ll add[100001];

ll hs[100005];
ll hs2[100005];

ll ans=0;
ll best=0;

ll powp[100005];

void bd()
{
    ll i;
    
    for(i=1;i<=n;i++)
        hs[i]=(hs[i-1]+(s[i-1]-'a'+1)*powp[i-1])%MOD;
    for(i=n;i>=1;i--)
        hs2[i]=(hs2[i+1]+(s[i-1]-'a'+1)*powp[n-i])%MOD;
}

ll get(ll x, ll y, ll wch)
{
    if(wch==1)
        return ((hs[y]-hs[x-1]+MOD)*powp[n-y])%MOD;
    else
        return ((hs2[x]-hs2[y+1]+MOD)*powp[x-1])%MOD;
}

ll ok(ll x, ll aa, ll bb)
{
    if(aa-x<=0 || bb+x>n || get(aa-x, aa, 1)!=get(bb, bb+x, 2))
        return 0;
    return 1;
}

void wk2(int aa, int bb)
{
    ll lo=0, hi=n+1, m;
    while(lo<hi){
        m=(lo+hi)/2;
        if(ok(m, aa, bb))
            lo=m+1;
        else
            hi=m;
    }
    lo--;
    ans+=lo+1;
    if(aa==bb)
        decr[aa]-=lo+1;
    if(lo>=0){
        if(aa==bb)
            add[aa-lo]++, add[bb+1]-=2, add[bb+lo+2]++;
        else
            add[aa-lo]++, add[bb]--, add[bb+1]--, add[bb+lo+2]++;
    }
        
    if(aa-lo-1<=0 || bb+lo+1>=n+1)
        return;
    
    ll kp=lo;
    lo=0, hi=n+1;
    while(lo<hi){
        m=(lo+hi)/2;
        if(ok(m, aa-kp-2, bb+kp+2))
            lo=m+1;
        else
            hi=m;
    }
    inc[aa-kp-1][s[bb+kp]-'a'+1]+=lo+1;
    inc[bb+kp+1][s[aa-kp-2]-'a'+1]+=lo+1;
}

void ini()
{
    ll i;
    
    powp[0]=1;
    for(i=1;i<=100004;i++)
        powp[i]=powp[i-1]*P, powp[i]%=MOD;
}

void wk()
{
    ll i;
    
    ini();
    bd();
    
    for(i=1;i<=n;i++){
        wk2(i, i);
        if(i!=n)
            wk2(i, i+1);
    }
    
    ll add2=0;
    for(i=1;i<=n;i++)
        add2+=add[i], add[i]=add2;
    add2=0;
    for(i=1;i<=n;i++)
        add2+=add[i], decr[i]+=add2;
    
}

int main()
{
    ios_base:: sync_with_stdio(0); cin.tie(0); cout.tie(0);
    
    ll i, j;
    
    cin >> s, n=s.length();
    
    wk();
    for(i=0;i<n;i++){
        ll f=s[i]-'a'+1;
        for(j=1;j<=26;j++){
            if(j==f)
                continue;
            best=max(best, inc[i+1][j]-decr[i+1]);
        }
    }
    
    cout << ans+best << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...