Cod sursa(job #3170586)

Utilizator AlexDavid26Alex Bleotu AlexDavid26 Data 17 noiembrie 2023 19:45:30
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstring>

using namespace std;

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

long long base = 31, mod = 2147483647, power;

char str[2000005], pattern[2000005];

struct Hash {
    int base;
    int mod;
    long long value;

    Hash() { base = 0, mod = 0, value = 0; }
    Hash(int base, int mod) { this->base = base, this->mod = mod, value = 0; }

    void roll(char toRemove, char toAdd) {
        value = (((value - (long long)(toRemove * power) % mod) * base) % mod + toAdd) % mod;
    }

    void init(char *str, int length) {
        int p = 1;
        for (int i = length - 1; i >= 0; i--, p *= base)
            value += (int) (str[i] * p) % mod;
    }

    bool operator==(const Hash& other) const { return value == other.value; }
};

Hash patternHash(base, mod), strHash(base, mod);

int main() {
    fin >> pattern >> str;

    patternHash.init(pattern, strlen(pattern));
    strHash.init(str, strlen(pattern));

    int length = strlen(str), pLength = strlen(pattern);
    power = pow(base, pLength - 1);

    int sol[1005], solutions = 0;

    for (int i = pLength - 1; i < length - 1; i++) {
        if (strHash == patternHash) {
            solutions++;
            if (solutions < 1000)
                sol[solutions - 1] = i - pLength + 1;
        }
        strHash.roll(str[i - pLength + 1], str[i + 1]);
    }

    fout << solutions << "\n";
    for (int i = 0; i < solutions && i < 1000; i++)
        fout << sol[i] << " ";
}