Pagini recente » Cod sursa (job #329180) | Cod sursa (job #2325233) | Cod sursa (job #1429689) | Cod sursa (job #1987205) | Cod sursa (job #847220)
Cod sursa(job #847220)
#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;
}