Cod sursa(job #1481398)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 4 septembrie 2015 13:09:09
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int MAX_N = 1000000;

char BUFF[MAX_N + 1];
char S[2*MAX_N + 10];
int D[2*MAX_N + 5], rightmost, iRightmost;
int starSum[2*MAX_N + 5];

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

    int i, j, n, k;

    gets(BUFF); n = strlen(BUFF);

    for(i = 1, j = 0; i < 2*n; i++) {
        if(i & 1) S[i] = BUFF[j++];
        else S[i] = '*';

        starSum[i] = starSum[i-1];
        if(S[i] == '*') starSum[i]++;
    }

    n = 2*n-1; rightmost = 1; iRightmost = 1; D[1] = 0;
    for(i = 2; i <= n; i++) {
        if(i > rightmost) {
            for(j = 1; S[i-j] == S[i+j] && i + j <= n; j++);
            rightmost = i + j - 1;
            iRightmost = i;
            D[i] = j - 1;
        }
        else {
            j = 2*iRightmost - i;
            if(i + D[j] < rightmost) D[i] = D[j];
            else {
                for(j = rightmost - i + 1; S[i-j] == S[i+j] && i + j <= n; j++);
                if(i + j - 1 > rightmost) rightmost = i + j - 1, iRightmost = i;
                D[i] = j - 1;
            }
        }
    }

    long long ans = 0;
    for(i = 1; i <= n; i++)
        ans += (D[i] + 1 - starSum[i+D[i]] + starSum[i-1]);

    printf("%lld\n", ans);

    return 0;
}