Cod sursa(job #1818356)

Utilizator antanaAntonia Boca antana Data 29 noiembrie 2016 09:19:18
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <cstdio>
#define MAXN 100000

int v[MAXN+1], man[MAXN+1], s[MAXN];

inline int minim(int a, int b){
    return (a < b ? a : b);
}

int main()
{
    freopen("numarare.in", "r", stdin);
    freopen("numarare.out", "w", stdout);

    int n, c, dr, i;
    long long ans = 0;

    scanf("%d", &n);

    for(i=1; i<=n; ++i)
        scanf("%d", &v[i]);

    for(i=1; i<n; ++i)
        s[i] = v[i+1] - v[i];

    c = dr = 0;

    for(i=1; i<n; ++i)
    {
        if(i > dr)
            man[i] = 0;
        else man[i] = minim(dr-i, man[2*c-i]);

        while(i + man[i] + 1 < n && i - man[i] - 1 > 0 && s[i-man[i]-1] == s[i+man[i]+1])
            man[i]++;
        if(i + man[i] > dr)
        {
            c = i;
            dr = i + man[i];
        }

        ans = ans + man[i] + 1;
    }

    printf("%lld", ans);

    return 0;
}