Cod sursa(job #2181412)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 21 martie 2018 17:36:26
Problema PScPld Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <cctype>
using namespace std;
char v[2000005];
int rez[2000005];
/// TONI BO$$ was here
/// #MLC
int main()
{
    int n,fl,i,c,r,j,a,b;
    long long sum=0;
    freopen("pscpld.in","r",stdin);
    freopen("pscpld.out","w",stdout);
    n=0;
    v[0]='$';
    do
    {
        fl=1;
        n++;
        v[n]=getchar();
        if(isalpha(v[n]))
            v[++n]='$';
        else
            fl=0;
    }while(fl);
    c=1;
    r=2;
    n--;
    rez[1]=1;
    for(j=2; j<n; j++){
        i=2*c-j;
        if(j>=r){
            a=j-1;
            b=j+1;
            while(a>=0 && b<=n){
                if(v[a]==v[b])
                    a--,b++,rez[j]++;
                else
                    break;}
            c=j;
            r=c+rez[c];
            continue ;
        }
        if(rez[i]<r-j || r==n){
            rez[j]=rez[i];
            continue ;
        }
        rez[j]=r-j;
        a=j-rez[j]-1;
        b=r+1;
        while(a>=0 && b<=n){
            if(v[a]==v[b])
                a--,b++,rez[j]++;
            else
                break;}
        if(r<j+rez[j]){
            c=j;
            r=c+rez[c];
        }
    }
    for(i=1; i<n; i++)
        sum+=(rez[i]+1)/2;
    printf("%lld\n",sum);

    return 0;
}