Cod sursa(job #2678896)

Utilizator VladAlecuVlad Alecu VladAlecu Data 28 noiembrie 2020 22:48:41
Problema Potrivirea sirurilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include<fstream>
#include<vector>

using namespace std;

#define ALPHABET_SIZE 256

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

    vector<int> positions;
    int prime = 101;
    int patternLength = pattern.size();
    int textLength = text.size();
    int patternHash = 0, textHash = 0, index = 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++) {
        if (patternHash == textHash) { //daca hash-urile sunt egale, compar
            
            for (index = 0; index < patternLength; index++) {
                if (pattern[index] != text[i + index]) {
                    break;
                }
            }

            if (patternLength == index) {
                count++;
                //positions.push_back(i);
                if (positions.size() < 1000) {
                    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);

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

    output << count << "\n";

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

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

    return 0;
}