Pagini recente » Cod sursa (job #592395) | Cod sursa (job #2541487) | Cod sursa (job #2333991) | Cod sursa (job #1098104) | Cod sursa (job #2595868)
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("numarare.in");
ofstream g("numarare.out");
int v[100002],p[100002];
int n,manacher[100002];
void Manacher()
{
int i,st,dr,poz=0,l=0,ll;
for(i=2;i<=n;i++)
p[i-1]=v[i]-v[i-1];
for(i=1;i<=n-1;i++)
{
if(i>poz+l)
{
poz=i;
l=0;
st=i-1;
dr=i+1;
while(st>=1&&dr<=n-1&&p[st]==p[dr])
{
st--;
dr++;
l++;
}
manacher[i]=l;
}
else
{
if(i+manacher[2*poz-i]<poz+l)
manacher[i]=manacher[2*poz-i];
else
if(i+manacher[2*poz-i]>poz+l)
manacher[i]=poz+l-i;
else
{
st=i-manacher[2*poz-i]-1;
dr=poz+l+1;
ll=0;
while(st>=1&&dr<=n-1&&p[st]==p[dr])
{
st--;
dr++;
ll++;
}
manacher[i]=poz+l-i;
if(ll!=0)
{
manacher[i]+=ll;
poz=i;
l=manacher[i];
}
}
}
}
}
int main()
{
int i;
long long sol=0;
f>>n;
for(i=1;i<=n;i++)
f>>v[i];
Manacher();
for(i=1;i<=n-1;i++)
sol+=manacher[i]+1;
g<<sol;
return 0;
}