Cod sursa(job #2724228)

Utilizator zarg169Roxana zarg169 Data 16 martie 2021 19:15:15
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <string>
#include <fstream>

using namespace std;
unsigned int hashes[2000005];
unsigned int powers[2000005];
unsigned int base = 257;

void buildHashValues(string text) {
    unsigned int n = text.size();
    for (unsigned int i = n; i >= 1; --i) {
        hashes[i] = (hashes[i + 1] * base + text[i - 1]);
    }
}

void buildPowers(string text) {
    unsigned int n = text.size();
    powers[0] = 1;
    for (unsigned int i = 1; i <= n; ++i) {
        powers[i] = powers[i-1] * base;
    }
}

unsigned int patternHashValue(string pattern) {
    unsigned int n = pattern.size();
    unsigned int patternHash = 0;
    for (unsigned int i = n; i >= 1; --i) {
        patternHash = (patternHash * base + pattern[i - 1]);
    }
    return patternHash;
}

unsigned int hashText(unsigned int left, unsigned int right) {
    return (hashes[left] - hashes[right + 1] * powers[right - left + 1]);
}

bool patternTextMatch(unsigned int patternHash, unsigned int left, unsigned int right) {
    return patternHash == hashText(left, right);
}


int main()
{
    ifstream fin("strmatch.in");
    ofstream fout("strmatch.out");

    string text, pattern;
    fin >> pattern >> text;

    buildHashValues(text);
    buildPowers(text);
    unsigned int h = patternHashValue(pattern);
    unsigned int cnt = 0;
    unsigned int n = text.size();

    for (unsigned int i = 1; i + pattern.size() - 1 <= n; ++i) {
        if (patternTextMatch(h, i, i + pattern.size() - 1)){
            cnt += 1;
        }
    }
    fout << cnt << "\n";

    cnt = 0;
    for (unsigned int i = 1; i + pattern.size() - 1 <= n; ++i) {
        if (cnt < 1000 && patternTextMatch(h, i, i + pattern.size() - 1)) {
            cnt += 1;
            fout << i - 1 << " ";
        }
    }

    return 0;
}