Cod sursa(job #1212813)

Utilizator nicolaegutaNicolae Guta nicolaeguta Data 26 iulie 2014 00:09:48
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <cstdio>
#define Nmax 100005

using namespace std;

int a[Nmax],Z[Nmax],N;

inline void Manacher()
{
    int L,M=0,R=0,t,i;
    Z[1]=0;
    for(i=2;i<=N;++i)
        if(i>R)
        {
            M=i;
            for(R=M+1;R<=N && a[R]==a[2*M-R];++R);
            --R;
            Z[i]=R-M;
        }
        else
        {
            t=2*M-i; L=2*M-R;
            if(Z[t]<t-L)
                Z[i]=Z[t];
            else
            {
                M=i;
                for(++R;R<=N && a[R]==a[2*i-R];++R);
                --R;
                Z[i]=R-M;
            }
        }
}

int main()
{
    long long sol;
    int i;
    freopen ("numarare.in","r",stdin);
    freopen ("numarare.out","w",stdout);
    scanf("%d", &N);
    for(i=1;i<=N;++i)
        scanf("%d", &a[i]);
    for(i=2;i<=N;++i)
        a[i-1]=a[i]-a[i-1];
    --N;
    Manacher();
    sol=N;
    for(i=1;i<=N;++i)
        sol+=Z[i];
    printf("%lld\n", sol);
    return 0;
}