Cod sursa(job #1449888)

Utilizator stefanzzzStefan Popa stefanzzz Data 10 iunie 2015 20:59:35
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <stdio.h>
#include <string.h>
#define MAXN 1000005
#define MIN(a, b) (((a) < (b))?(a):(b))
using namespace std;

long long sol;
int n, lg[2 * MAXN], mxr, c, l, r, x;
char s[MAXN];

int main() {
    freopen("pscpld.in", "r", stdin);
    freopen("pscpld.out", "w", stdout);
    int i;

    scanf("%s\n", s + 1);
    n = strlen(s + 1);

    for(i = 1; i < 2 * n; i++) {

        if (mxr >= i) {
            x = 2 * c - i;
            lg[i] = MIN(lg[x], (mxr - i) / 2 + 1);
        }
         
        if(i % 2)
            x = l = r = (i + 1) / 2;
        else {
            l = i / 2;
            x = r = l + 1;
        }

        l -= lg[i]; r += lg[i];

        while (l > 0 && r <= n && s[l--] == s[r++]) lg[i]++;
        x += lg[i] - 1;
        x = x * 2 - 1;

        if(x > mxr) {
            mxr = x;
            c = i;
        }

        sol += lg[i];
    }

    printf("%lld\n", sol);
    
    return 0;
}