Cod sursa(job #2678885)

Utilizator VladAlecuVlad Alecu VladAlecu Data 28 noiembrie 2020 22:17:32
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include<bits/stdc++.h>
using namespace std;

#define ALPHABET_SIZE 256

vector<int> RabinKarp (string pattern, string text) {

    vector<int> positions;
    int prime = 101;
    int patternLength = pattern.size();
    int textLength = text.size();
    int patternHash = 0, textHash = 0, pos = 0;
    int h = 1;

    for (int i = 1; i < patternLength; i++) {
        h = (h * ALPHABET_SIZE) % prime;
    }

    //hash-ul pattern-ului si primului bloc din text
    for (int i = 0; i < patternLength; i++) {
        patternHash = (ALPHABET_SIZE*patternHash + pattern[i]) % prime;
        textHash = (ALPHABET_SIZE*textHash + text[i]) % prime;
    }

    //parcurg textul si iau blocuri de lungime patternLength
    for (int i = 0; i <= (textLength-patternLength); i++) {
        pos = patternLength;
        if (patternHash == textHash) {
            //daca hash-urile sunt egale, compar 
            for (int j = 0; j < patternLength; j++) {
                if (pattern[j] != text[i + j]) {
                    pos = j;
                    break;
                }
            }

            if (patternLength == pos) {
                positions.push_back(i);
            }
        }

        if (i < (textLength-patternLength)) {
            textHash = (ALPHABET_SIZE*(textHash - text[i]*h) + text[i+patternLength]) % prime;
            if (textHash < 0) {
                textHash += prime;
            }
        }
    }

    return positions;
}


int main() {

    ifstream input;
    ofstream output;
    string pattern, text;
    
    input.open("strmatch.in", ios::in);
    output.open("strmatch.out", ios::out);

    getline(input, pattern);
    getline(input, text);

    vector<int> positions = RabinKarp(pattern, text);

    output << positions.size() << "\n";

    for (int i = 0; i < (int)positions.size(); i++) {
        output << positions.at(i) << " ";
    }

    input.close();
    output.close();

    return 0;
}