Pagini recente » Cod sursa (job #383516) | Cod sursa (job #1585067) | Cod sursa (job #190979) | Cod sursa (job #2836083) | Cod sursa (job #2606064)
#include <iostream>
using namespace std;
const int NMAX = 100000;
int N, v[NMAX + 2], a[NMAX + 5];
int manacher[NMAX + 5];
void Manacher()
{
int drMax = 0, posDrMax = 0;
for(int i = 1; i <= N - 1; i++)
if(i > drMax)
{
int st = i - 1, dr = i + 1;
while(st >= 1 && dr <= N - 1 && a[st] == a[dr])
st--, dr++;
st++, dr--;
manacher[i] = dr - i;
drMax = dr, posDrMax = i;
}
else
{
if(i + manacher[2 * posDrMax - i] < drMax)
manacher[i] = manacher[2 * posDrMax - i];
else
{
int st = 2 * i - drMax, dr = drMax;
while(st >= 1 && dr <= N - 1 && a[st] == a[dr])
st--, dr++;
st++, dr--;
manacher[i] = dr - i;
drMax = dr, posDrMax = i;
}
}
}
int main()
{
cin >> N;
for(int i = 1; i <= N; i++)
cin >> v[i];
for(int i = 1; i <= N - 1; i++)
a[i] = v[i + 1] - v[i];
Manacher();
long long sol = 0;
for(int i = 1; i <= N - 1; i++)
sol += (1ll * manacher[i] + 1);
cout << sol << '\n';
return 0;
}