Cod sursa(job #2298561)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 8 decembrie 2018 11:25:28
Problema Reguli Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("reguli.in");
ofstream g("reguli.out");

int N, x;
vector<long long> a, phi;

int kmp(vector<long long> x);

int main()
{
    f >> N;
    for(int i = 0; i < N; i++)
        f >> x, a.push_back(x);

    for(int i = 0; i < N - 1; i++)
        a[i] = a[i + 1] - a[i], cout << a[i] << " ";
    a.pop_back();
    int dr = kmp(a), st = dr;
    for(st = dr; phi[st] != 1 && st >= 0; st--);
    if(st < 0) st = 0;
    g << dr - st + 1 << "\n";
    for(int i = st; i <= dr; i++)
        g << a[i] << "\n";
    return 0;
}

int kmp(vector<long long> x) {
    int MAX = 0;
    phi.resize(x.size(), 0);
    for(int i = 1; i < x.size(); i++) {
        int rez = phi[i - 1];
        while(rez && x[i] != x[rez])
            rez = phi[rez - 1];
        if(x[i] == x[rez]) rez++;
        phi[i] = rez;
        if(((i + 1) - phi[i]) <= (i + 1) && (i + 1) % ((i + 1) - phi[i]) == 0)
            MAX = i;
    }
    cout << "\n";
    for(auto i : phi)
        cout << i;
    return MAX;

}