Cod sursa(job #2160807)

Utilizator xRoALexBirtoiu Alexandru xRoALex Data 11 martie 2018 13:57:48
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
/*C=1 R=0 i=1
d[1]=1
...

(.I.R...C...R.i.)

d[i] = d[I]

;((.I.),R...C...R,(.i.)),


while pot extinde i
,(i),
d[i]++

C=i
R=raza la care ajunge i=d[i]
i++*/
#include <fstream>

using namespace std;
int sol[2000005];

ifstream f("pscpld.in");
ofstream g("pscpld.out");
long long ans ;
string s;
int main()
{
    char a;
    s+='*';
    while(f>>a)
    {
        s+=a;
        s+='*';
    }
    int r=-1,c=0,rad;
    for(int i=0;i<s.size();i++)
    {
        if(i<=r)
            rad=min(sol[2*c-i],r-i)+1;
        else
            rad=0;
        while(i-rad>=0 && i+rad<s.size() && s[i-rad]==s[i+rad])
            rad++;
        sol[i] = rad-1;
        if(i+sol[i]-1>r)
        {
            c=i;
            r=i+sol[i]-1;
        }
    }
    for(int i=0;i<s.size();++i)
    {
        ans += (1LL*(sol[i]+1))/2;
    }
    g<<ans;
    return 0;
}