Pagini recente » Cod sursa (job #2115601) | Cod sursa (job #3190555) | Cod sursa (job #2128903) | Cod sursa (job #568512) | Cod sursa (job #479597)
Cod sursa(job #479597)
#include <cstdio>
#include <algorithm>
const int maxN = 100100;
const int baza = 30000;
const int mod = 32767;
const int DIM = 8192 ;
using namespace std;
char s[10 * maxN];
int V[maxN], D[maxN];
int h1[maxN], h2[maxN], powerB[maxN];
int N, rez;\
int pz ;
char ax[DIM] ;
inline void cit(int &x)
{
int semn = 1;
x=0;
while((ax[pz]< '0' || ax[pz] > '9') || ax[pz] == '-')
if(++pz==DIM)fread(ax,1,DIM,stdin),pz=0;
if(ax[pz] == '-')
{
semn = -1;
if(++pz==DIM)fread(ax,1,DIM,stdin),pz=0;
}
while(ax[pz]>='0' && ax[pz]<='9')
{
x=x*10+ax[pz]-'0';
if(++pz==DIM)fread(ax,1,DIM,stdin),pz=0;
}
x *= semn;
}
int main() {
int i, j;
freopen("numarare.in", "r", stdin);
freopen("numarare.out", "w", stdout);
cit ( N ) ;
for ( int i = 1; i <= N; ++i ) {
cit ( V[i] ) ;
}/*
fgets(s, 1000000, stdin);
j = 0;
for (i = 1; i <= N; i++) {
int sgn = 1;
if (s[j] == '-') {
sgn = -1;
j++;
}
while (s[j] >= '0' && s[j] <= '9') {
V[i] = V[i] * 10 + (s[j] - 48);
j++;
}
while (s[j] == ' ')
j++;
V[i] *= sgn;
}*/
powerB[0] = 1;
for (i = 1; i < N; i++) {
D[i] = V[i] - V[i + 1] + 200000;
h1[i] = (h1[i - 1] * baza + D[i]) % mod;
powerB[i] = (powerB[i - 1] * baza) % mod;
}
powerB[N] = (powerB[N - 1] * baza) % mod;
for (i = N - 1; i > 0; i--) {
h2[i] = (h2[i + 1] * baza + D[i]) % mod;
}
for (i = 1; i < N; i++) {
int left, right, m, sol = 0;
left = 1;
right = min(i, N - i - 1);
if (D[i - 1] == D[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] - ((h1[i - m - 1] * powerB[m + 1]) % mod);
if (R1 < 0) R1 += mod;
R2 = h2[i] - ((h2[i + m + 1] * powerB[m + 1]) % mod);
if (R2 < 0) R2 += mod;
if (R1 == R2) {
left = m + 1;
sol = m;
} else
right = m - 1;
}
}
rez = rez + sol + 1;
}
printf("%d\n", rez);
return 0;
}