Cod sursa(job #645392)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 9 decembrie 2011 15:28:13
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <cstdio>

const int N = 1000005;

char s[N], a[N << 1];

int n, c, mdr, d[N << 1];

void edit() {
    for (int i = 1; s[i]; ++i) {
        n = 2 * i;
        a[2 * i - 1] = s[i];
        a[2 * i] = '?';
    }
}

void extinde(int poz, int dr, int st) {
    c = poz;

    while (a[dr] == a[st] && st > 0 && dr < n) {
        ++d[poz];
        mdr = dr;
        ++dr;
        --st;
    }
}

void solve() {
    for (int i = 1; i <= n; ++i)
        if (mdr > i) {   
            if (c - (i - c) - d[c - (i - c)] > c - d[c])
                d[i] = d[c - (i - c)];
            else {
                d[i] = mdr - i;
                extinde(i, i + d[i] + 1, i - d[i] - 1);
            }
        } else
            extinde (i, i + 1, i - 1);
}

void afis() {
    long long rez = 0;

    for (int i = 1; i <= n; ++i)
        rez += d[i] / 2 + i % 2;

    printf("%lld", rez);
}

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

    gets(s + 1);
    
    edit();

    solve();

    afis();

    return 0;
}