Cod sursa(job #1005224)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 4 octombrie 2013 16:01:48
Problema Reguli Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<stdio.h>
#include<string.h>

#define NMAX 500007

int x, n, T, Ans;
int pi[NMAX];
int a[NMAX], b[NMAX];

inline bool perioada(int n, int Ind){
    int p = n - Ind;
    while(p)
        if(pi[p] == n - Ind - 1)
            return 1;
        else
            p = pi[p];
    return 0;
}

void fa_x(int b[], int i)
{
    while(x > 0 && b[x + 1] != b[i])
        x = pi[x];
    if(b[x + 1] == b[i])
        ++ x;
}

void KMP(int a[NMAX]){
    memset(pi, 0, sizeof(pi));
    for(int i = 2; i <= n; ++ i)
    {
        fa_x(a, i);
        pi[i] = x;
    }
}

int main(){
    freopen("reguli.in", "r", stdin);
    freopen("reguli.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; ++ i)
        scanf("%d", &b[i]);
    for(int i = 1; i < n; ++ i)
        a[i] = b[i + 1] - b[i];
    KMP(a);
    Ans = n - 1;
    for(int i = 1; i < n; ++ i)
        if(pi[i] != 0 && i % (i - pi[i]) != 0 && i - pi[i] < Ans && perioada(n, i) == 1)
            Ans = i - pi[i];
    printf("%d\n", Ans);
    for(int i = 1; i <= Ans; ++ i)
        printf("%d\n", a[i]);
    return 0;
}