Cod sursa(job #1519149)

Utilizator MayuriMayuri Mayuri Data 6 noiembrie 2015 21:47:56
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int NMAX = 1000000;

int p[2 * NMAX + 5];
char ss[NMAX + 5], s[NMAX * 2 + 5];

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

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

    gets(ss + 1);

    int n = strlen(ss + 1), j = 1, aux, st, dr, rasp = 0;

    for(int i = 1; i <= n; ++ i) {
        if(j % 2 == 1) {
            s[j] = '#';
            ++ j;
        }
        s[j] = ss[i];
        ++ j;
    }

    s[j] = '#';

    n = j;
    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("%d", rasp);

    return 0;
}