Cod sursa(job #2674966)

Utilizator marquiswarrenMajor Marquis Warren marquiswarren Data 20 noiembrie 2020 22:08:33
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

vector<int> build_lps(const string &pattern, const string &text) {
    vector<int> lps(pattern.size());

    for (int i = 1, m = 0; i < pattern.size(); ++i) {
        if (pattern[i] == pattern[m])
            lps[i] = ++m;
        else if (m != 0)
            m = lps[m - 1], --i;
        else
            lps[i] = 0;
    }

    return lps;
}

vector<int> kmp(const string &pattern, const string &text) {
    const auto lps = build_lps(pattern, text);

    vector<int> matches;

    for (int i = 0, j = 0; j < text.size();) {
        if (pattern[i] != text[j]) {
            if (i == 0)
                ++j;
            else
                i = lps[i - 1];
        } else {
            ++i, ++j;

            if (i == pattern.size()) {
                matches.push_back(j - i);
                i = lps[i - 1];
            }
        }

    }

    return matches;
}

int main() {
    ifstream in("strmatch.in");
    ofstream out("strmatch.out");

    string pattern, text;
    in >> pattern >> text;

    auto matches = kmp(pattern, text);

    out << matches.size() << '\n';
    int k = min(1000ul, matches.size());
    for (int i = 0; i < k; ++i)
        out << matches[i] << ' ';
}