Cod sursa(job #2402709)

Utilizator mihneacazCazacu Mihnea mihneacaz Data 10 aprilie 2019 22:36:14
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <fstream>
#include <algorithm>
#include <vector>

const int NMAX=2000000;

using namespace std;

int z[NMAX+5];

ifstream cin("pscpld.in");
ofstream cout("pscpld.out");

int main()
{
    string si,s;
    cin>>si;
    s="$";
    for(int i=0; i<si.size(); ++i)
    {
        s+=si[i];
        s+="$";
    }
    int r=0,c=0;
    for(int i=1; i<(int)s.size(); ++i)
    {
        if(i>r)
        {
            while(i-z[i]>=0 && i+z[i]<(int)s.size() && s[i+z[i]]==s[i-z[i]])
                z[i]+=1;
        }
        else
        {
            int leftover=min(z[c-z[c]+(i-c)],r-i);
            z[i]=leftover;
            while(i-z[i]>=0 && i+z[i]<(int)s.size() && s[i+z[i]]==s[i-z[i]])
                z[i]+=1;
        }
        if(i+z[i]>r)
        {
            r=i+z[i];
            c=i;
        }
       // cout<<z[i]<<" ";
    }
    long long sum=0;
    for(int i=1; i<(int)s.size(); ++i)
    {
        if(s[i]=='$')
            sum--;
        sum=sum+1LL*(z[i]+1)/2;
    }
    cout<<sum<<'\n';
    return 0;
}