Cod sursa(job #1309441)

Utilizator SmarandaMaria Pandele Smaranda Data 5 ianuarie 2015 19:11:22
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>

using namespace std;

const int N = 1000003;

char s [N], a [2 * N];
int dp [2 * N];
long long ans = 0;

int main () {
    int i, u, last, l, st, dr;

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

    gets (s);
    u = 0;
    a [++ u] = '*';
    for (i = 0; s [i]; i ++) {
        a [++ u] = s [i];
        a [++ u] = '*';
    }
    dp [0] = 0;
    last = 0;
    l = 0;
    for (i = 1; i <= u; i ++) {
        if (i >= l) {
            st = i; dr = i;
            while (st >= 1 && dr <= u && a [st] == a [dr]) {
                st --; dr ++;
            }
            st ++; dr --;
            dp [i] = dr - st + 1;
            l = dr;
            last = i;
        }
        if (i < l) {
            dp [i] = dp [last - (i - last)];
            if (dp  [i] / 2 + i >= l) {
                dp [i] = 1 + (l - i) * 2;
                dr = l + 1;
                st = i - (dr - i);
                while (st >= 1 && dr <= u && a [st] == a [dr]) {
                    st --; dr ++;
                }
                st ++;
                dr --;
                dp [i] = dr - st + 1;
                l = dr;
                last = i;
            }
        }
    }
    for (i = 1; i <= u; i ++) {
        if (a [i] == '*')
            ans = ans + 1ll * dp [i] / 4;
        else
            ans = ans + 1ll * dp [i] / 4 + 1;
    }
    printf ("%lld\n", ans);
    return 0;
}