Cod sursa(job #3340154)

Utilizator Horia_haivasHaivas Horia Horia_haivas Data 12 februarie 2026 11:26:26
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
#define int long long

using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int range_rng(int l, int r)
{
    return uniform_int_distribution<int>(l,r)(rng);
}

int vl[2000005];
int vr[2000005];

signed main()
{
    ///*
    ifstream fin("pscpld.in");
    ofstream fout("pscpld.out");
    //*/
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,i,j,l,r,sl,sr,mirror,mid,len,ans;
    string s,s2;
    fin >> s2;
    for (auto x : s2)
    {
        s+='.';
        s+=x;
    }
    s+='.';
    l=0;
    r=0;
    n=s.size();
    s="$"+s;
    ans=0;
    for (i=1; i<=n; i++)
    {
        if (i<=r)
        {
            mid=(r+l)/2;
            mirror=mid-(i-mid);
            len=min(mirror-max(l,vl[mirror]),vr[mirror]-mirror);
            sl=i-len;
            sr=i+len;
            if (sr==r)
            {
                while (sr+1<=n && sl-1>=1 && s[sr+1]==s[sl-1])
                {
                    sr++;
                    sl--;
                }
                vr[i]=sr;
                vl[i]=sl;
            }
            else///se termina pana la r, deci e gata deja
            {
                vr[i]=sr;
                vl[i]=sl;
            }
        }
        else
        {
            sr=i;
            sl=i;
            while (sr+1<=n && sl-1>=1 && s[sr+1]==s[sl-1])
            {
                sr++;
                sl--;
            }
            vr[i]=sr;
            vl[i]=sl;
        }
        if (vr[i]>r)
        {
            r=vr[i];
            l=vl[i];
        }
        if (s[i]=='.')
            ans+=((vr[i]-vl[i])/2)/2;
        else
            ans+=((vr[i]-vl[i])/2+1)/2;
    }
    fout << ans;
    return 0;
}