Cod sursa(job #471883)

Utilizator DraStiKDragos Oprica DraStiK Data 21 iulie 2010 16:21:08
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <algorithm>
using namespace std;

#define DIM 100005

int v[DIM],d[DIM],l[DIM];
long long nrt;
int n;

void read ()
{
    int i;

    scanf ("%d",&n);
    for (i=1; i<=n; ++i)
    {
        scanf ("%d",&v[i]);
        if (i>1)
        {
            d[i-1]=v[i]-v[i-1];
            l[i-1]=1;
        }
    }
}

void solve ()
{
    int i,st,dr,fs,ls;


    for (st=dr=i=1; i<n; ++i)
    {
        if (dr>i)
            l[i]=min (l[(st<<1)-i],dr-i+1);
        for (fs=i-l[i], ls=i+l[i]; fs>0 && ls<n; )
        {
            if (i+l[i]-1>dr)
            {
				st=i;
                dr=i+l[i]-1;
            }
            if (d[fs]==d[ls])
            {
				++l[i];
                --fs;
				++ls;
			}
			else
                break;
        }
        nrt+=l[i];
    }
    printf ("%lld",nrt);
}

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

    read ();
    solve ();

    return 0;
}