Pagini recente » Cod sursa (job #1036080) | Cod sursa (job #1846565) | Cod sursa (job #879115) | Cod sursa (job #970684) | Cod sursa (job #479577)
Cod sursa(job #479577)
#include <cstdio>
#include <algorithm>
const int maxN = 100100;
const int baza = 200000;
const int mod = 666013;
using namespace std;
char s[10 * maxN];
int V[maxN], D[maxN];
int h1[maxN], h2[maxN], powerB[maxN];
int N, rez;
int main() {
int i, j;
freopen("numarare.in", "r", stdin);
freopen("numarare.out", "w", stdout);
scanf("%d ", &N);
for (i = 1; i <= N; i++)
scanf("%d", &V[i]);
/* fgets(s, 1000000, stdin);
j = s[0];
for (i = 1; i <= N; i++) {
while (s[j] >= '0' && s[j] <= '9') {
V[i] = V[i] * 10 + (s[j] - 48);
j++;
}
while (s[j] < '0' || s[j] > '9')
j++;
}*/
for (i = 1; i < N; i++) {
D[i] = V[i] - V[i + 1] + 200000;
// fprintf(stderr, "%d ", D[i]);
}
// fprintf(stderr, "\n");
for (i = 1; i < N; i++) {
h1[i] = (1LL * h1[i - 1] * baza + D[i]) % mod;
// fprintf(stderr, "%d ", h1[i]);
}
// fprintf(stderr, "\n");
for (i = N - 1; i > 0; i--) {
h2[i] = (1LL * h2[i + 1] * baza + D[i]) % mod;
// fprintf(stderr, "%d ", h2[i]);
}
// fprintf(stderr, "\n");
powerB[0] = 1;
for (i = 1; i <= N; i++)
powerB[i] = (1LL * powerB[i - 1] * baza) % mod;
for (i = 1; i < N; i++) {
int left, right, m, sol = 0;
left = 1; right = min(i, N - i - 1);
while (left <= right) {
m = (left + right) / 2;
//o sa am de la i - m la i + m
int R1, R2;
R1 = h1[i] - (1LL * h1[i - m - 1] * powerB[m + 1] % mod);
if (R1 < 0) R1 += mod;
R2 = h2[i] - (1LL * h2[i + m + 1] * powerB[m + 1] % mod);
if (R2 < 0) R2 += mod;
/* if (i == 4) {
fprintf(stderr, "%d %d %d\n", m, R1, R2);
}*/
if (R1 == R2) {
left = m + 1;
sol = m;
}
else
right = m - 1;
}
// fprintf(stderr, "%d %d\n", i, sol);
rez = rez + sol + 1;
}
printf("%d\n", rez);
return 0;
}