Cod sursa(job #3233214)

Utilizator MirceaDonciuLicentaLicenta Mircea Donciu MirceaDonciuLicenta Data 2 iunie 2024 19:54:02
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

vector<int> computeLPSArray(const string& pat) {
    int M = pat.length();
    vector<int> lps(M, 0);
    int length = 0;
    int i = 1;
    while (i < M) {
        if (pat[i] == pat[length]) {
            length++;
            lps[i] = length;
            i++;
        } else {
            if (length != 0) {
                length = lps[length - 1];
            } else {
                lps[i] = 0;
                i++;
            }
        }
    }
    return lps;
}

vector<int> KMPSearch(const string& pat, const string& txt) {
    int M = pat.length();
    int N = txt.length();
    vector<int> lps = computeLPSArray(pat);
    vector<int> result;

    int i = 0;
    int j = 0;
    while (i < N) {
        if (pat[j] == txt[i]) {
            j++;
            i++;
        }

        if (j == M) {
            result.push_back(i - j);
            j = lps[j - 1];
        } else if (i < N && pat[j] != txt[i]) {
            if (j != 0) {
                j = lps[j - 1];
            } else {
                i++;
            }
        }
    }
    return result;
}

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

    if (!infile || !outfile) {
        cerr << "Error opening file" << endl;
        return 1;
    }

    string A, B;
    getline(infile, A);
    getline(infile, B);

    vector<int> matches = KMPSearch(A, B);

    int num_matches = matches.size();
    outfile << num_matches << endl;
    for (int i = 0; i < min(num_matches, 1000); ++i) {
        outfile << matches[i] << " ";
    }
    outfile << endl;

    infile.close();
    outfile.close();

    return 0;
}