Cod sursa(job #2639076)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 31 iulie 2020 12:10:01
Problema Numarare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#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();
}