Cod sursa(job #847220)

Utilizator stoicatheoFlirk Navok stoicatheo Data 3 ianuarie 2013 16:32:30
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 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;
}