Cod sursa(job #2485008)

Utilizator dianaICHBghita diana dianaICHB Data 31 octombrie 2019 21:19:35
Problema Numarare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>

int v[100005],w[100005],k[100005];
using namespace std;
int main ()
{
    freopen ("numarare.in","r",stdin);
    freopen ("numarare.out","w",stdout);
    int n,m,i,con;
    scanf ("%d", &n);
    for (i=1;i<=n;i++)
    {
        scanf ("%d",&v[i]);
        if (i>=3)
            w[i-2]=v[i]-v[i-2];
    }
    m=n-2;
    con=1;
    if (w[1]==w[2])
        k[1]=1;

    for (i=2;i<=m;i++)
    {
        if (i<con+k[con])
        {
            if ((k[con-(i-con)]<con+k[con]-i))
            k[i]=k[con-(i-con)];
            else
                k[i]=con+k[con]-i;
        }

        if (con+k[con]<=i+k[i])
        {
            con=i;
            while (i-(k[i]+1)+1>=1&&i+(k[i]+1)<=m&&w[i+(k[i]+1)]==w[i-(k[i]+1)+1])
            {
                k[i]++;
            }
        }
    }
    long long int sol=n-1;
    for (i=1;i<=m;i++)
        sol=sol+k[i];
    printf ("%lld",sol);
    return 0;
}