Pagini recente » Monitorul de evaluare | Cod sursa (job #2758076) | Cod sursa (job #207767) | Cod sursa (job #1891714) | Cod sursa (job #2016416)
#include <cstdio>
const int MAX_N = 100000;
int v[MAX_N], dif[2*MAX_N];
int d[2*MAX_N];
int main() {
int n, n2;
long long rez = 0LL;
FILE *fin = fopen("numarare.in", "r");
fscanf(fin, "%d", &n);
rez = n - 1;
for(int i = 0; i < n; ++i)
fscanf(fin, "%d", &v[i]);
fclose(fin);
n2 = 0;
for(int i = 0; i < n - 1; ++i) {
dif[i * 2] = v[i + 1] - v[i];
dif[i * 2 + 1] = -1;
}
n2 = 2 * n - 2;
int st, cent, dr;
st = cent = dr = 0;
for(int i = 1; i < n2; ++i) {
if(i > dr)
st = cent = dr = i;
else {
d[i] = d[2 * cent - i];
if(i + d[i] >= dr) {
d[i] = dr - i;
cent = i;
st = cent - d[i];
dr = cent + d[i];
}
}
while(st - 1 >= 0 && dr + 1 < n2 && dif[st - 1] == dif[dr + 1]) {
++d[cent];
--st;
++dr;
}
if(i % 2 == 1)
rez = rez + (d[i] + 1) / 2;
}
FILE *fout = fopen("numarare.out", "w");
fprintf(fout, "%lld", rez);
fclose(fout);
return 0;
}