Pagini recente » Cod sursa (job #1498132) | Cod sursa (job #2423106) | Cod sursa (job #1495800) | Cod sursa (job #2929448) | Cod sursa (job #466855)
Cod sursa(job #466855)
#include <cstdio>
#define ll long long
#define N 100010
int n;
int a[N];
int lun[N];
ll rez;
inline void citire()
{
scanf("%d",&n);
for(int i=1; i<=n; ++i)
scanf("%d",&a[i]);
}
inline void rezolva()
{
for(int i=1; i<n; ++i)
a[i]-=a[i+1];
int st=1;
int dr=1;
int aux;
int n1=n-1;
++rez;
for(int i=2; i<n; ++i)
{
if(i<=dr)
{
aux=dr-i;
if(i+lun[st+aux]>=dr)
{
lun[i]=dr-i;
st=i-lun[i];
dr=i+lun[i];
while(st>1 && dr<n1 && a[st-1]==a[dr+1])
{
--st;
++dr;
++lun[i];
}
}
else
lun[i]=lun[st+aux];
}
else
{
st=dr=i;
lun[i]=0;
while(st>1 && dr<n1 && a[st-1]==a[dr+1])
{
--st;
++dr;
++lun[i];
}
}
rez+=(ll)(lun[i]+1);
}
}
int main()
{
freopen("numarare.in","r",stdin);
freopen("numarare.out","w",stdout);
citire();
if(n==1)
{
printf("0\n");
return 0;
}
if(n==2)
{
printf("1\n");
return 0;
}
rezolva();
printf("%lld\n",rez);
return 0;
}