Cod sursa(job #3278817)

Utilizator Tudor_CCTudor Cocu Tudor_CC Data 20 februarie 2025 20:12:51
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

string s, a;
int lps[2000005]; // Tabela LPS
vector<int> v;    // Vector pentru a salva pozițiile potrivirilor

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

    cin >> a >> s; // Citim pattern-ul și textul

    // PASUL 1: Construirea LPS pentru pattern
    int m = a.size(); // Lungimea pattern-ului
    int n = s.size(); // Lungimea textului
    int i = 1, j = 0;

    // Calculăm tabela LPS
    while (i < m) {
        if (a[i] == a[j]) {
            j++;             // Creștem lungimea prefixului care este și sufix
            lps[i] = j;      // Setăm valoarea LPS
            i++;
        } else {
            if (j > 0) {
                j = lps[j - 1]; // Mergem la prefixul anterior
            } else {
                lps[i] = 0;     // Nu avem prefix-sufix valid
                i++;
            }
        }
    }

    // PASUL 2: Căutăm pattern-ul în text folosind KMP
    j = 0; // Resetăm j pentru a căuta pattern-ul în text
    for (i = 0; i < n; i++) {
        // Comparăm caracterele textului cu pattern-ul
        while (j > 0 && s[i] != a[j]) {
            j = lps[j - 1]; // Folosim LPS pentru a evita comparațiile inutile
        }

        if (s[i] == a[j]) {
            j++; // Avansăm în pattern
        }

        if (j == m) { // Dacă am găsit un match complet
            v.push_back(i - m + 1); // Salvăm indexul unde începe pattern-ul
            j = lps[j - 1]; // Continuăm căutarea
        }
    }

    // PASUL 3: Afișăm rezultatul
    cout << v.size() << "\n"; // Numărul de apariții
    for (int i = 0; i < v.size(); i++) {
        if (i > 0) cout << " "; // Adăugăm un spațiu doar între numere
        cout << v[i]; // Afișăm pozițiile
    }
    cout << "\n"; // Noua linie la final
    return 0;
}