Pagini recente » Cod sursa (job #1315711) | Cod sursa (job #2641496) | Cod sursa (job #511419) | Cod sursa (job #1950679) | Cod sursa (job #3206910)
#include <fstream>
const int NMAX=200005;
using namespace std;
ifstream cin("numarare.in");
ofstream cout("numarare.out");
void manacher(int [], int [], int);
int s[NMAX];
int ans[NMAX], n;
signed main()
{
int i;
long long sum=0;
cin>>n;
for(i=0; i<n; i++) cin>>s[i];
for(i=0; i<n-1; i++) s[i]=s[i+1]-s[i];
manacher(ans, s, n);
for(i=0; i<n-1; i++) sum+=ans[i]+1;
cout<<sum<<'\n';
return 0;
}
void manacher(int ans[], int s[], int n)
{
int i;
int dr=-1, st=-1;
for(i=0; i<n; i++)
{
if(i>dr) ans[i]=1;
else ans[i]=min(ans[dr+st-i], dr-i+1);
while(true)
{
if(i-ans[i]<0 || i+ans[i]>=n) break;
if(s[i+ans[i]]==s[i-ans[i]]) ans[i]++;
else break;
}
ans[i]--;
if(dr<=i+ans[i])
{
dr=i+ans[i];
st=i-ans[i];
}
}
}