Pagini recente » Cod sursa (job #264764) | Cod sursa (job #795220) | Cod sursa (job #2048749) | Cod sursa (job #1444645) | Cod sursa (job #2639076)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
ifstream fin("numarare.in");
ofstream fout("numarare.out");
const int DIM = 1000005;
int n,S[DIM],Sol[DIM];
long long ans=0;
void Read()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>S[i];
}
void Manacher()
{
/*int l=0,r=-1;
for(int i=0;i<n;i++)
{
int k=0;
if(i<=r)
k=min(B[l+r-i+1],r-i+1);
while(i-k-1>=0 && i+k<n && S[i-k-1]==S[i+k])
k++;
B[i]=k;
k--;
if(i+k>r)
{
l=i-k-1;
r=i+k;
}
}
*/
int l=0,r=-1;
for(int i=1;i<=n;i++)
{
int k=1;
if(i<=r)
k=min(Sol[l+r-i+1],r-i+1);
while(i-k-1>0 && i+k<=n && S[i-k-1]+S[i+k]==S[i-k]+S[i+k-1])
k++;
Sol[i]=k;
k--;
if(i+k>r)
{
l=i-k-1;
r=i+k;
}
}
for(int i=2;i<=n;i++)
ans+=Sol[i];
fout<<ans<<'\n';
}
int main()
{
Read();
Manacher();
}