Pagini recente » Cod sursa (job #402463) | Cod sursa (job #5831) | Cod sursa (job #1427144) | Cod sursa (job #1109486) | Cod sursa (job #465526)
Cod sursa(job #465526)
#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();
}