Cod sursa(job #465526)

Utilizator wefgefAndrei Grigorean wefgef Data 24 iunie 2010 17:00:53
Problema Numarare Scor Ascuns
Compilator cpp Status done
Runda Marime 1.14 kb
#include <cassert>
#include <cstdio>

const int MAX_N = 100005;

int n;
int a[MAX_N];
int v[MAX_N];
int best[MAX_N];

void read() {
    assert(freopen("numarare.in", "r", stdin) != NULL);
    assert(freopen("numarare.out", "w", stdout) != NULL);

    assert(scanf("%d", &n) == 1);
    for (int i = 1; i <= n; ++i)
        assert(scanf("%d", &a[i]) == 1);
}

void solve() {
    for (int i = 1; i < n; ++i)
        v[i] = a[i + 1] - a[i];

    int left = 0, right = 0;
    for (int i = 1; i < n; ++i) {
        bool expand = false;

        if (i > right) {
            left = right = i;
            expand = true;
        } else if (best[left + right - i] <= right - i)
            best[i] = best[left + right - i];
        else {
            expand = true;
            left = 2 * i - right;
        }

        if (expand)
        while (left > 1 && right + 1 < n && v[left - 1] == v[right + 1]) {
            --left;
            ++right;
        }
        best[(left + right) / 2] = (right - left) / 2 + 1;
    }

    long long sol = 0;
    for (int i = 1; i < n; ++i)
        sol += best[i];
    printf("%lld\n", sol);
}

int main() {
    read();
    solve();
}