Cod sursa(job #1200107)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 21 iunie 2014 21:40:26
Problema Reguli Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

/// cea mai scurta perioada pe sirul diferentelor dintre 2 termeni consecutivi

const int Lmax = 5e5 + 2;

int Text[Lmax];
int pi[Lmax];
int N;

void build_prefix()
{
    int lgprefix = 0;

    pi[1] = 0;

    for ( int i = 2; i <= N; ++i )
    {
        while ( lgprefix > 0 && Text[i] != Text[ lgprefix + 1 ] )
                    lgprefix = pi[ lgprefix ];

        if ( Text[i] == Text[ lgprefix + 1 ] )
                lgprefix++;

        pi[i] = lgprefix;
    }
}

int main()
{
    ifstream in("reguli.in");
    ofstream out("reguli.out");

    in >> N;

    for ( int i = 1, last = 0, x; i <= N; ++i )
    {
        in >> x;

        if ( i != 1 ) Text[i - 1] = x - last;
        last = x;
    }

    N--;

    build_prefix();

    out << N - pi[N] << "\n";

    in.close();
    out.close();

    return 0;
}