Cod sursa(job #2861197)

Utilizator Toaster_KeyboardMihaescu Vlad-Mihai Toaster_Keyboard Data 3 martie 2022 17:51:08
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#pragma region Template
#include <bits/stdc++.h>
using namespace std;
#define ll long long

// ======== Files ========
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
#pragma endregion Template

vector<long> automata_prefix(string str) {
    long len = str.length(), cnt = 0;
    vector<long> pi(len);
    for (long i = 1; i < len; i++) {
        while (cnt != 0 && str[cnt + 1] != str[i])
            cnt = pi[cnt];
        if (str[cnt + 1] == str[i])
            ++cnt;
        pi[i] = cnt;
    }
    return pi;
}

vector<long> automataKMP(vector<long> patt, string pattStr, string str) {
    long lenPat = pattStr.length() - 1, lenStr = str.length();
    vector<long> positions;
    long cnt = 0;
    for (long i = 1; i < lenStr; i++) {
        while (cnt != 0 && pattStr[cnt + 1] != str[i]) {
            cnt = patt[cnt - 1];
        }
        if (pattStr[cnt + 1] == str[i])
            ++cnt;
        if (cnt == lenPat)
            positions.push_back(i - lenPat);
    }
    return positions;
}

void prlong(vector<long> toPrlong) {
    fout << toPrint.size() << '\n';
    if (long(toPrint.size()) > 1000)
        for (long i = 0; i < 1000; i++)
            fout << toPrint[i] << ' ';
    else
        for (long i = 0; i < long(toPrint.size()); i++)
            fout << toPrint[i] << ' ';
}

void solve() {
    string pattern, text;
    fin >> pattern >> text;
    vector<long> prefixVector = automata_prefix(pattern);
    vector<long> ans = automataKMP(prefixVector, pattern, text);
    print(ans);
}

int main() {
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    int t = 1;  //cin >> t;
    while (t--) {
        solve();
    }

    return 0;
}