Cod sursa(job #1722401)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 27 iunie 2016 23:41:45
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <algorithm>

const int SIZE = 2e6 + 5;
using namespace std;

char S1[SIZE], S[SIZE];
int N, left, right, middle, position, L[SIZE];
long long answer;

int main() {

    freopen( "pscpld.in" , "r", stdin  );
    freopen( "pscpld.out", "w", stdout );

    scanf( "%s", S1 + 1 );

    for( int i = 1; S1[i] != 0; i ++ ) {
        S[++N] = '&';
        S[++N] = S1[i];
    }

    S[++N] = '&';

    for( int i = 1; i <= N; i ++ ) {

        if( i > right ) {
            left = right = middle = i; L[i] = 1;

            while( left > 1 && right < N && S[left - 1] == S[right + 1] ) {
                L[i] ++;
                left --; right ++;
            }
        } else {
            position = middle - (i - middle);

            if( position - (L[position] - 1) == left ) {
                L[i] = L[position]; middle = i;
                left = i - (right - i);

                while( left > 1 && right < N && S[left - 1] == S[right + 1] ) {
                    L[i] ++;
                    left --; right ++;
                }
            } else
                L[i] = min( L[position], right - i + 1 );
        }

        answer += L[i] / 2;
    }

    printf( "%lld\n", answer );

    return 0;
}