Cod sursa(job #2454550)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 8 septembrie 2019 23:52:11
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");
char a[1000005],v[2000005];
int n,i,j,k,nr,centru,dreapta,lg[2000005];
long long sol;
int main()
{
    f>>(a+1);
    n=strlen(a+1);
    for(i=1;i<=n;i++)
    {
        nr++;
        v[nr]='#';
        nr++;
        v[nr]=a[i];
    }
    nr++;
    v[nr]='#';
    for(i=1;i<=nr;i++)
    {
        if(i<dreapta)
        {
            lg[i]=min(lg[2*centru-i],dreapta-i);
        }
        j=i-lg[i]-1;
        k=i+lg[i]+1;
        while(j>=1 && k<=nr && v[j]==v[k])
        {
            lg[i]++;
            j--;
            k++;
        }
        sol+=(lg[i]+1)/2;
        if(i+lg[i]>dreapta)
        {
            dreapta=i+lg[i];
            centru=i;
        }
    }
    g<<sol;
    return 0;
}