Cod sursa(job #1526)

Utilizator dominoMircea Pasoi domino Data 13 decembrie 2006 23:09:35
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define MAX_N 1000005
#define FIN "pscpld.in"
#define FOUT "pscpld.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)

int N, R[MAX_N<<1]; long long Res;
char S[MAX_N], S2[MAX_N<<1];

int main(void)
{
    int i, j, k;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    fgets(S, MAX_N, stdin);
    N = strlen(S)-1;

    FOR (i, 0, N) S2[i<<1] = S2[(i<<1)|1] = S[i];
    N <<= 1;

    for (i = j = 0; i < N; i += k)
    {
        for (; i-j >= 0 && i+j+1 < N && S2[i-j] == S2[i+j+1]; j++);
        R[i] = j;
        for (k = 1; k <= j && i >= k && R[i-k] != R[i]-k; k++)
        {
            R[i+k] = min(R[i-k], R[i]-k);
            Res += (R[i+k]+1)>>1;
        }
        j = max(0, R[i]-k);
        Res += (R[i]+1)>>1;
    }

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


    return 0;
}