Cod sursa(job #780547)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 20 august 2012 19:11:19
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int kMaxN = 100005;

int N, X[kMaxN], DP[kMaxN];
long long S;

inline int Expand(int Left, int Right, int Center)
{
    int Length = 0;
    while (Left > 0 && Right <= N && X[Left]+X[Right] == X[Center]+X[Center+1])
        --Left, ++Right, ++Length;
    return Length;
}

void Solve() {
    int Center=0, Last=0;
    for (int i = 1, Left, Right; i < N; ++i) {
        if (Last > i)
            DP[i] = min(DP[Center-(i-Center)], Last-i-1);

        Left = i-DP[i];
        Right = i+1+DP[i];
        DP[i] += Expand(Left, Right, i);

        if (i+1+DP[i]>Last)
            Center=i, Last=i+1+DP[i];
        S += DP[i];
    }
}

void Read ()
{
    freopen("numarare.in", "r", stdin);
    scanf("%d", &N);
    for (int i = 1; i <= N; ++i)
        scanf("%d", &X[i]);
}

void Print() {
    freopen("numarare.out", "w", stdout);
    printf("%lld\n", S);
}

int main() {
    Read();
    Solve();
    Print();
    return 0;
}