Cod sursa(job #514694)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 19 decembrie 2010 13:42:19
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <stdio.h>
#define Nmax 100002

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

inline int Minim(int x,int y){ return x<y ? x:y; }

int main(){
    int i,st,dr,sol;
    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=1;i<=N;++i) a[i]-=a[i+1];
    N--;

    st=1; dr=1;
    sol=N;
    for(i=2;i<=N;++i){
        if( i<=dr ){
            lg[i]=Minim(lg[dr+st-i],dr-i);
            if( lg[i]==dr-i ){
                st=i-lg[i]; dr=i+lg[i];
                while( st>0 && dr<=N && a[st]==a[dr] ) st--, dr++;
                st++; dr--;
                lg[i]=(dr-st+1)/2;
            }
        }
        else{
            st=dr=i;
            while( st>0 && dr<=N && a[st]==a[dr] ) st--, dr++;
            st++; dr--;
            lg[i]=(dr-st+1)/2;
        }

        sol += lg[i];
    }

    printf("%d\n",sol);
    fclose(stdin); fclose(stdout);
    return 0;
}