Cod sursa(job #3156691)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 12 octombrie 2023 13:58:19
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.82 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");
int n,d[1000005],e[1000005];
long long s;
char a[1000005];
int E(int i,int j)
{
    int k;
    for(k=0;a[i-k]==a[j+k]&&a[i-k];++k);
    return k;
}
void O()
{
    int i,r=0,p=0;
    for(i=1;i<=n;++i) {
        if(i<=r)
            e[i]=min(e[2*p-i],r-i);
        e[i]+=E(i-e[i],i+e[i]);
        if(e[i]+i>r)
            p=i,r=p+e[i];
        s+=e[i];
    }
}
void V()
{
    int i,r=0,p=0;
    for(i=1;i<=n;++i)
        if(a[i]==a[i+1]) {
            if(i<r)
                d[i]=min(d[2*p-i],r-i-1);
            d[i]+=E(i-d[i],i+d[i]+1);
            if(d[i]+i+1>r)
                p=i,r=p+1+d[i];
            s+=d[i];
        }
}
int main ()
{
    f>>(a+1),n=strlen(a+1),V(),O(),g<<s;
    return 0;
}