Cod sursa(job #790162)

Utilizator veleanduAlex Velea veleandu Data 20 septembrie 2012 16:16:23
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 1000005

    long n,i,Dif;
    char Text[maxn];
    long Rez[2*maxn];
    long Last[2*maxn];

    long long rez;


int main()
{
    freopen ("pscpld.in","r",stdin);
    freopen ("pscpld.out","w",stdout);
    scanf ("%s", &Text );
    n=strlen(Text);
    for ( i=0; i<2*n; i++ )
    {
        if ( i%2==0 )
        {
            Dif= Last[Dif];
            for ( ; ( ( Text[ (i>>1)-Dif ] == Text[ (i>>1)+Dif ] ) && ( (i>>1)-Dif>=0 ) && ( (i>>1)+Dif<n ) ); Dif++ )
                if ( !Last[ i + 2*Dif ] )
                    Last[ i + 2*Dif ] = Last[ i - 2*Dif ];
            Rez [ i ]= Dif;
        }
        else{
            Dif= Last[Dif];
            for ( ; ( ( Text[ (i>>1)-Dif ] == Text[ (i>>1)+Dif+1 ] ) && ( (i>>1)-Dif>=0 ) && ( (i>>1)+Dif+1<n ) ); Dif++ )
                if ( !Last[ i + 2*Dif ] )
                    Last[ i + 2*Dif ] = Rez[ i - 2*Dif ];
            Rez [ i ] = Dif;
        }
    }
    for ( i=0; i<2*n; i++ )
        rez+=Rez[i];
    cout<<rez<<"\n";
    return 0;
}