Cod sursa(job #3242405)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 11 septembrie 2024 21:51:41
Problema Potrivirea sirurilor Scor 6
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <string>
#include <vector>

std::vector<int> kmp(const std::string& pattern, const std::string& text) {
    std::vector<int> lps(pattern.size(), 0);
    int current_lps = 0;
    for (int i = 1; i < (int)pattern.size(); i++) {
        while (current_lps > 0 && pattern[i] != pattern[current_lps])
            current_lps = lps[current_lps - 1];
        
        if (pattern[i] == pattern[current_lps]) current_lps++;

        lps[i] = current_lps;
    }

    std::vector<int> appearances;
    int current_pref = 0;
    for (int i = 0; i < (int)text.size(); i++) {
        while (current_pref > 0 && text[i] != pattern[current_pref])
            current_pref = lps[current_lps - 1];

        if (text[i] == pattern[current_pref]) current_pref++;

        if (current_pref == (int)pattern.size()) {
            appearances.push_back(i - (int)pattern.size() + 1);
            current_pref = lps[current_pref - 1];
        }
    }

    return appearances;
}

int main() {
    std::ifstream cin("strmatch.in");
    std::ofstream cout("strmatch.out");

    std::string pattern, text;
    cin >> pattern >> text;

    std::vector<int> appearances = kmp(pattern, text);

    cout << appearances.size() << '\n';
    for (int i = 0; i < std::min(1000, (int)appearances.size()); i++)
        cout << appearances[i] << ' ';

    return 0;
}