Cod sursa(job #466179)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 26 iunie 2010 11:52:40
Problema Numarare Scor Ascuns
Compilator cpp Status done
Runda Marime 1.19 kb
#include <cstdio>
#include <cassert>
#include <algorithm>
#include <vector>

using namespace std;

#define MAXN 100000
#define MAXV 100000

int N, x[MAXN], v[MAXN];
int p[MAXN];

int main() {
    freopen("numarare.in", "rt", stdin);
#ifndef DEBUG
    freopen("numarare.out", "wt", stdout);
#endif

    assert(scanf("%d", &N) == 1);
    assert(1 <= N && N <= MAXN);

    int MIN = 0x3f3f3f3f, MAX = -0x3f3f3f3f;
    for (int i = 0; i < N; i++) {
        assert(scanf("%d", x + i) == 1);
        assert(x[i] <= MAXV);
        MIN = min(MIN, x[i]);
        MAX = max(MAX, x[i]);
        v[i] = x[i] - x[i - 1];
    }

    int last = -1, lastBegin = -1;
    for (int i = 1; i < N; i++) {
        if (last >= i) {
            p[i] = min(p[lastBegin + (last - i)], (last - i) * 2 + 1);
        }
        int l = i - ((p[i] + 1) / 2), r = i + ((p[i] + 1) / 2);
        for (; l >= 1 && r < N && v[l] == v[r]; l--, r++) {
            p[i] += 1 + (l != r);
        }
        l++; r--;
        if (r >= last) {
            last = r;
            lastBegin = l;
        }
    }

    // TODO: long long
    int NR = 0;
    for (int i = 1; i < N; i++) {
        NR += p[i] / 2 + 1;
    }
    printf("%d\n", NR);
    return 0;
}