Cod sursa(job #2595868)

Utilizator armigheGheorghe Liviu Armand armighe Data 8 aprilie 2020 16:10:20
Problema Numarare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#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;
}