Pagini recente » Cod sursa (job #1626673) | Cod sursa (job #2317381) | Cod sursa (job #1589761) | Cod sursa (job #1952642) | Cod sursa (job #466724)
Cod sursa(job #466724)
#include <cstdio>
#include <algorithm>
using namespace std;
#define Nmax 100010
int n, N;
int v[Nmax], d[Nmax], L[Nmax], x[Nmax];
void citire () {
scanf ("%d", &n);
for (int i = 1; i <= n; i++) {
scanf ("%d", &x[i]);
if (i >= 3)
d[i - 2] = x[i] - x[i-2];
}
}
void palind () {
int i, pal;
pal = 1;
if (d[1] == d[2])
L[1] = 1;
for (i = 2; i <= N; i++) {
if (i < pal + L[pal]) {
L[i] = min(L[pal - (i - pal)], pal + L[pal] - i);
}
if (pal + L[pal] <= i + L[i]) {
pal = i;
while (i - (L[i] + 1) + 1 >= 1 && i + (L[i] + 1) <= N && d[i + (L[i] + 1)] == d[i - (L[i] + 1) + 1] ) {
L[i]++;
}
}
}
}
void rezolva () {
long long sol = n - 1;
for (int i = 1; i <= N; i++)
sol+= L[i];
printf ("%lld", sol);
}
int main () {
freopen ("numarare.in", "r", stdin);
freopen ("numarare.out", "w", stdout);
citire ();
N = n - 2;
palind ();
rezolva ();
/*for (int i = 1; i <= n; i++)
printf ("%d ", L[i]);*/
return 0;
}