Pagini recente » Diferente pentru dijkstra-buckets intre reviziile 1 si 2 | Cod sursa (job #3361867) | Cod sursa (job #3362174) | Cod sursa (job #3364351) | Cod sursa (job #3363879)
#include <bits/stdc++.h>
using namespace std;
ifstream f("numarare.in");
ofstream g("numarare.out");
int s[200009];
int copie[100009];
int n;
int l[200009];
int v[100009];
void manacher ()
{
s[1]=INT_MAX;
for (int i=1; i<=n; i++)
s[2*i]=copie[i], s[2*i+1]=INT_MAX;
int poz=0;
//cout << (s+1);
n=2*n+1;
for (int i=1; i<=n; i++)
{
if (poz+l[poz]<i)
{
poz=i;
int st=i-1, dr=i+1;
while (st>=1 && dr<=n && s[st]==s[dr])
{
st--;
dr++;
l[poz]++;
}
}
else
{
int ogl=2*poz-i;
if (poz+l[poz]>i+l[ogl])
l[i]=l[ogl];
else if (poz+l[poz]<i+l[ogl])
l[i]=poz+l[poz]-i;
else if (poz+l[poz]==i+l[ogl])
{
l[i]=l[ogl];
int st=i-l[i]-1, dr=i+l[i]+1;
bool ok=0;
while (st>=1 && dr<=n && s[st]==s[dr])
{
ok=1;
l[i]++;
st--;
dr++;
}
if (ok) poz=i;
}
}
}
}
signed main ()
{
f >> n;
for (int i=1; i<=n; i++)
f >> v[i];
for (int i=1; i<n; i++)
copie[i]=v[i+1]-v[i];
n--;
manacher ();
long long ans=0;
//for (int i=1; i<=n; i++)
//cout << s[i]<<' ';
for (int i=1; i<=n; i++)
{
if (s[i]==INT_MAX)
{
ans+=(l[i]/2)/2;
//cout << l[i]/2<<'\n';
}
else
{
ans+=l[i]/2+1;
//cout << l[i]/2+1 <<'\n';
}
}
g << ans;
}