Pagini recente » Cod sursa (job #1984917) | Cod sursa (job #795447) | Cod sursa (job #2697759) | Cod sursa (job #792978) | Cod sursa (job #752104)
Cod sursa(job #752104)
#include<stdio.h>
#define maxn 100005
FILE*f=fopen("numarare.in","r");
FILE*g=fopen("numarare.out","w");
int n,stmax,drmax;
int v[maxn],D[maxn];
inline int min ( const int &a , const int &b ){
return a <= b ? a : b;
}
int main () {
fscanf(f,"%d",&n);
for ( int i = 1 ; i <= n ; ++i ){
fscanf(f,"%d",&v[i]);
}
for ( int i = 1 ; i < n ; ++i ){
v[i] = v[i+1] - v[i];
}
v[n] = 0;
for ( int i = 1 ; i < n ; ++i ){
if ( i <= drmax ){
D[i] = min(D[stmax+drmax-i],drmax-i);
int p = i - D[i],u = i + D[i];
for ( ; p > 0 && u < n && v[p] == v[u] ; ++D[i] , --p , ++u );
if ( drmax < u-1 ){
drmax = u-1; stmax = p+1;
}
}
else{
int p = i,u = i;
for ( ; p > 0 && u < n && v[p] == v[u] ; ++D[i] , --p , ++u );
drmax = u-1; stmax = p+1;
}
}
long long sol = 0;
for ( int i = 1 ; i < n ; ++i ){
sol += D[i];
}
fprintf(g,"%d\n",sol);
fclose(f);
fclose(g);
return 0;
}