Cod sursa(job #2791606)

Utilizator vansJos da pa perete vans Data 30 octombrie 2021 20:33:23
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

const int o = 5e5 * (1 << 2);
const int ooo = (1 << 1) * (1 << 0), oo_ = (1 << 1) + (1 << 0);

int _, oo, o_, _o[ooo * o + oo_], o_o, o__[ooo + 1000 + oo_];
char _oo[ooo * o + oo_], _o_[o + ooo / oo_];

void ___() {
    for(int oooo = ooo / oo_, ooo_ = 0, oo_o = 0; oooo < o_; ++oooo) {
        if(oooo <= oo_o) {
            _o[oooo] = min(_o[oooo - ooo_], oo_o - oooo + 1);
        }
        while(oooo + _o[oooo] < o_ && _oo[_o[oooo]] == _oo[oooo + _o[oooo]]) {
            ++_o[oooo];
        }
        if(oooo + _o[oooo] - 1 > oo_o)
            ooo_ = oooo, oo_o = oooo + _o[oooo] - ooo / ooo;
    }
}

int main()
{
    freopen("strmatch.in", "r", stdin);
    freopen("strmatch.out", "w", stdout);
    scanf("%s%s", _oo, _o_);
    _ = strlen(_oo);
    oo = strlen(_o_);

    strcpy(_oo + _ + 1, _o_);
    _oo[_] = '#';
    o_ = _ + oo + ooo / ooo;

    ___();
    for(int oooo = _ + 1; oooo < o_; ++oooo)
        if(_o[oooo] == _) {
            ++o_o;
            if(o_o <= 1000) o__[o_o] = oooo - _ - 1;
        }
    printf("%d\n", o_o);
    o_o = min(o_o, 1000);
    for(int oooo = 1; oooo <= o_o; ++oooo)
        printf("%d ", o__[oooo]);
    return 0;
}