Cod sursa(job #3363879)

Utilizator robertcosacCosac Robert-Mihai robertcosac Data 24 august 2026 17:47:19
Problema Numarare Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("numarare.in");
ofstream g("numarare.out");
int s[200009];
int copie[100009];
int n;
int l[200009];
int v[100009];
void manacher ()
{
    s[1]=INT_MAX;
    for (int i=1; i<=n; i++)
        s[2*i]=copie[i], s[2*i+1]=INT_MAX;
    int poz=0;
    //cout << (s+1);
    n=2*n+1;
    for (int i=1; i<=n; i++)
    {
        if (poz+l[poz]<i)
        {
            poz=i;
            int st=i-1, dr=i+1;
            while (st>=1 && dr<=n && s[st]==s[dr])
            {
                st--;
                dr++;
                l[poz]++;
            }
        }
        else
        {
            int ogl=2*poz-i;
            if (poz+l[poz]>i+l[ogl])
                l[i]=l[ogl];
            else if (poz+l[poz]<i+l[ogl])
                l[i]=poz+l[poz]-i;
            else if (poz+l[poz]==i+l[ogl])
            {
                l[i]=l[ogl];
                int st=i-l[i]-1, dr=i+l[i]+1;
                bool ok=0;
                while (st>=1 && dr<=n && s[st]==s[dr])
                {
                    ok=1;
                    l[i]++;
                    st--;
                    dr++;
                }
                if (ok) poz=i;
            }
        }
    }
}
signed main ()
{
    f >> n;
    for (int i=1; i<=n; i++)
        f >> v[i];
    for (int i=1; i<n; i++)
        copie[i]=v[i+1]-v[i];
    n--;
    manacher ();
    long long ans=0;
    //for (int i=1; i<=n; i++)
        //cout << s[i]<<' ';
    for (int i=1; i<=n; i++)
    {
        if (s[i]==INT_MAX)
        {
            ans+=(l[i]/2)/2;
            //cout << l[i]/2<<'\n';
        }
        else
        {
            ans+=l[i]/2+1;
            //cout << l[i]/2+1 <<'\n';
        }
    }
    g << ans;
}