Cod sursa(job #484805)

Utilizator SpiderManSimoiu Robert SpiderMan Data 15 septembrie 2010 21:29:50
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
# include <cstdio>

const char FIN[] = "numarare.in", FOU[] = "numarare.out" ;
const int MAX = 100005;

int S[MAX], B[MAX], best[MAX] ;
int N, sol ;

inline int min ( int A, int B ) {
    if ( A < B ) {
        return A ;
    } else {
        return B ;
    }
}

int main ( void ) {
    freopen ( FIN, "r", stdin ) ;

    scanf ( "%d", &N ) ;
    for ( int i = 1; i <= N; ++i ) {
        scanf ( "%d", S + i ) ;
        if ( i > 1 ) {
            B[i - 1] = S[i - 1] - S[i] ;
        }
    }

    int a = 1, b = 1 ;

    for ( int i = 1; i < N; ++i ) {
        if ( i < a ) {
            best[i] = min ( best[ b - ( i - b ) ], a - i + 1 ) ;
        }

        for ( int st = i - best[i], dr = i + best[i] ; st && dr < N ; B[st] == B[dr] ? ( --st, ++dr, ++best[i] ) : dr = N ) {
            if ( a < i + best[i] - 1 ) {
                a = i + best[i] - 1 ;
                b = i ;
            }
        }

        sol += best[i];
    }


    fprintf ( fopen ( FOU, "w" ) , "%d" , sol ) ;

    return 0;
}