Cod sursa(job #2861440)

Utilizator Toaster_KeyboardMihaescu Vlad-Mihai Toaster_Keyboard Data 3 martie 2022 23:06:45
Problema Potrivirea sirurilor Scor 78
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#pragma region Template
#include <bits/stdc++.h>
using namespace std;
#define ll int int

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

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

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

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

void solve() {
    string pattern, text;
    fin >> pattern >> text;

    transform(pattern.begin(), pattern.end(), pattern.begin(), ::tolower);
    transform(text.begin(), text.end(), text.begin(), ::tolower);

    vector<int> prefixVector = automata_prefix(pattern);
    vector<int> 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;
}