Pagini recente » Cod sursa (job #920692) | Cod sursa (job #2766473) | Cod sursa (job #41078) | Cod sursa (job #1964203) | Cod sursa (job #514694)
Cod sursa(job #514694)
#include <stdio.h>
#define Nmax 100002
int a[Nmax],lg[Nmax];
int N;
inline int Minim(int x,int y){ return x<y ? x:y; }
int main(){
int i,st,dr,sol;
freopen("numarare.in","r",stdin);
freopen("numarare.out","w",stdout);
scanf("%d",&N);
for(i=1;i<=N;++i) scanf("%d",&a[i]);
for(i=1;i<=N;++i) a[i]-=a[i+1];
N--;
st=1; dr=1;
sol=N;
for(i=2;i<=N;++i){
if( i<=dr ){
lg[i]=Minim(lg[dr+st-i],dr-i);
if( lg[i]==dr-i ){
st=i-lg[i]; dr=i+lg[i];
while( st>0 && dr<=N && a[st]==a[dr] ) st--, dr++;
st++; dr--;
lg[i]=(dr-st+1)/2;
}
}
else{
st=dr=i;
while( st>0 && dr<=N && a[st]==a[dr] ) st--, dr++;
st++; dr--;
lg[i]=(dr-st+1)/2;
}
sol += lg[i];
}
printf("%d\n",sol);
fclose(stdin); fclose(stdout);
return 0;
}