Pagini recente » Istoria paginii runda/winner5/clasament | Cod sursa (job #1270848) | Istoria paginii runda/agm/clasament | Cod sursa (job #1535044) | Cod sursa (job #1818356)
#include <cstdio>
#define MAXN 100000
int v[MAXN+1], man[MAXN+1], s[MAXN];
inline int minim(int a, int b){
return (a < b ? a : b);
}
int main()
{
freopen("numarare.in", "r", stdin);
freopen("numarare.out", "w", stdout);
int n, c, dr, i;
long long ans = 0;
scanf("%d", &n);
for(i=1; i<=n; ++i)
scanf("%d", &v[i]);
for(i=1; i<n; ++i)
s[i] = v[i+1] - v[i];
c = dr = 0;
for(i=1; i<n; ++i)
{
if(i > dr)
man[i] = 0;
else man[i] = minim(dr-i, man[2*c-i]);
while(i + man[i] + 1 < n && i - man[i] - 1 > 0 && s[i-man[i]-1] == s[i+man[i]+1])
man[i]++;
if(i + man[i] > dr)
{
c = i;
dr = i + man[i];
}
ans = ans + man[i] + 1;
}
printf("%lld", ans);
return 0;
}