Cod sursa(job #1730550)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 17 iulie 2016 02:45:41
Problema Reguli Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <cstdio>
#include <fstream>
#include <vector>

class input_reader {

private:

    FILE *input_file;
    static const int SIZE = 1 << 12;
    char Buffer[SIZE]; int Cursor, Sign;

    inline void Advance( void ) {
        if( ++ Cursor == SIZE ) {
            Cursor = 0;
            fread( Buffer, SIZE, 1, input_file );
        } return;
    }

    inline char Current( void ) {
        return Buffer[Cursor];
    }

public:

    input_reader() {}
    input_reader( const char *file_name ) {
        input_file = fopen( file_name, "r" );
        fread( Buffer, SIZE, 1, input_file );
        Cursor = 0;
    }

    template <class type>
    input_reader &operator >>( type &Value ) {
        Value = 0; Sign = 1;

        while( Current() < '0' || Current() > '9' ) {
            if( Current() == '-' ) Sign = -1;
            Advance();
        }

        while( Current() >= '0' && Current() <= '9' ) {
            Value = Value * 10 + ( Current() - '0' ) * Sign;
            Advance();
        }

        return *this;
    }

} input_file( "reguli.in" );
std::ofstream output_file( "reguli.out" );

void SolveTestCase( void ) {
    int N; long long X, Y, L = 0;

    input_file >> N;
    std::vector <int> Prefix( N );
    std::vector <long long> Array( N );

    input_file >> X;
    for( int i = 2; i <= N; i ++ ) {
        input_file >> Y;
        Array[i - 1] = Y - X;
        X = Y;
    }

    N --;
    for( int i = 2; i <= N; i ++ ) {

        while( L != 0 && Array[i] != Array[L + 1] )
            L = Prefix[L];

        if( Array[i] == Array[L + 1] )
            L ++;

        Prefix[i] = L;
    }

    output_file << N - Prefix[N] << "\n";

    for( int i = 1; i <= N - Prefix[N]; i ++ )
        output_file << Array[i] << "\n";

    return;
}

int main( int argc, const char *argv[] ) {
    int T = 1;

    for( int i = 1; i <= T; i ++ )
        SolveTestCase();

    return 0;
}