Cod sursa(job #3341617)

Utilizator Cristian_NegoitaCristian Negoita Cristian_Negoita Data 20 februarie 2026 14:03:22
Problema Potrivirea sirurilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
int n, m;
string needle, haystack;

struct Hash
{
    const int BASE = 31, MOD1 = 1e9 + 7, MOD2 = 1e9 + 9;
    vector<int> hsh1, hsh2, pwr1, pwr2;
    void build(const string &word)
    {
        hsh1.resize(word.size()), hsh2.resize(word.size());
        pwr1.resize(word.size()), pwr2.resize(word.size());
        hsh1[0] = 0, hsh2[0] = 0;
        pwr1[0] = 1, pwr2[0] = 1;
        for(int i = 1; i < word.size(); i++)
        {
            hsh1[i] = (1LL * BASE * hsh1[i-1] + (word[i] - 'A' + 1)) % MOD1;
            hsh2[i] = (1LL * BASE * hsh2[i-1] + (word[i] - 'A' + 1)) % MOD2;
            pwr1[i] = (1LL * BASE * pwr1[i-1]) % MOD1;
            pwr2[i] = (1LL * BASE * pwr2[i-1]) % MOD2;
        }
    }
    pair<int, int> get_hash(int st, int dr)
    {
        pair<int, int> H;
        H.first = (hsh1[dr] - (1LL * hsh1[st - 1] * pwr1[dr - st + 1]) % MOD1 + MOD1) % MOD1;
        H.second = (hsh2[dr] - (1LL * hsh2[st - 1] * pwr2[dr - st + 1]) % MOD2 + MOD2) % MOD2;
        return H;
    }
};

int main()
{
    fin >> needle >> haystack;
    n = needle.size(), m = haystack.size();
    needle = ' ' + needle, haystack = ' ' + haystack;
    Hash small_hash, big_hash;
    small_hash.build(needle), big_hash.build(haystack);
    vector<int> positions;
    auto target = small_hash.get_hash(1, n);
    for(int i = 1; i + n - 1 <= m; i++)
        if(target == big_hash.get_hash(i, i + n - 1))
            positions.push_back(i - 1);
    fout << positions.size() << "\n";
    for(int i = 0; i < min((int)positions.size(), 1000); i++)
        fout << positions[i] << " ";

    fin.close();
    fout.close();
    return 0;
}