Cod sursa(job #1868213)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 4 februarie 2017 18:05:32
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <cstring>

using namespace std;

char ss[1000005], s[2000005];
int p[2000005];

void solve(int poz, int n) {
    while(poz + p[poz] <= n && poz - p[poz] > 0 && s[poz + p[poz]] == s[poz - p[poz]]) {
        ++ p[poz];
    }
    -- p[poz];
}

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

    int n, aux, j, st, dr;
    long long rasp = 0;

    gets(ss);
    n = strlen(ss);
    aux = 0;
    for(int i = 0; i < n; ++ i) {
        aux += 2;
        s[aux] = ss[i];
    }
    ++ aux;
    n = aux;

    j = 1;
    for(int i = 2; i < n; ++ i) {
        aux = 2 * j - i;
        st = j - p[j];
        dr = j + p[j];
        if(i > dr) {
            solve(i, n);
            j = i;
        } else
        if(aux - p[aux] > st) {
            p[i] = p[aux];
        } else {
            p[i] = dr - i;
            solve(i, n);
            j = i;
        }
        rasp += (p[i] + 1) / 2;
    }

    printf("%lld", rasp);

    return 0;
}