Cod sursa(job #2964212)

Utilizator MR0L3eXMaracine Constantin Razvan MR0L3eX Data 12 ianuarie 2023 17:21:35
Problema Potrivirea sirurilor Scor 32
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.89 kb
#include "bits/stdc++.h"

using namespace std;

#if defined(ONPC)
#include "bits/debug.h"
#endif

using i64 = long long;

#define uid(a, b) uniform_int_distribution<int>(a, b)(rng)
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

class HashedString {
    private:
        static const int P = 53;
        static const int mod = 1e9 + 7;

        static const int P2 = 59;
        static const int mod2 = 1e9 + 9;
        int N = -1;

        vector<int> pw, pw2;
        vector<int> ha, ha2;

        int mul(int a, int b, int MOD) { return (i64) a * b % MOD; }
        int add(int a, int b, int MOD) { a += b; if (a >= MOD) a -= MOD; return a; }
        int sub(int a, int b, int MOD) { a -= b; if (a < 0) a += MOD; return a; }

    public:
        HashedString(const string &s) {
            N = (int)s.size();
            ha = vector<int>(N + 1);
            ha2 = vector<int>(N + 1);
            pw = vector<int>(N + 1);
            pw2 = vector<int>(N + 1);

            pw[0] = 1, pw2[0] = 1;
            for (int i = 0; i < N; ++i) {
                ha[i + 1] = add(mul(ha[i], P, mod), (s[i] - 'A' + 1), mod);
                ha2[i + 1] = add(mul(ha2[i], P2, mod2), (s[i] - 'A' + 1), mod2);
                pw[i + 1] = mul(pw[i], P, mod);
                pw2[i + 1] = mul(pw2[i], P2, mod2);
            }
        }

        pair<int, int> get_hash(const int &l, const int &r) { // [l, r)
            pair<int, int> ans;
            ans.first = sub(ha[r], mul(ha[l], pw[r - l], mod), mod);
            ans.second = sub(ha2[r], mul(ha2[l], pw2[r - l], mod2), mod2);
            return ans;
        }
};

int Mul(int a, int b, int MOD) { return (i64) a * b % MOD; }
int Add(int a, int b, int MOD) { a += b; if (a >= MOD) a -= MOD; return a; }
int Sub(int a, int b, int MOD) { a -= b; if (a < 0) a += MOD; return a; }

pair<int, int> hash_str(const string &s) {
        const int P1 = 53;
        const int mod1 = 1e9 + 7;

        const int P2 = 59;
        const int mod2 = 1e9 + 9;

        int ha1 = 0, ha2 = 0;
        for (int i = 0; i < (int)s.size(); ++i) {
            ha1 = Add(Mul(ha1, P1, mod1), (s[i] - 'A' + 1), mod1);
            ha2 = Add(Mul(ha2, P2, mod2), (s[i] - 'A' + 1), mod2);
        }

        return {ha1, ha2};
}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    freopen("strmatch.in", "r", stdin);
    freopen("strmatch.out", "w", stdout);

    string s, t;
    cin >> s >> t;
    int n = (int)s.size(), m = (int)t.size();
    if (n > m) {
        cout << "0\n";
        return 0;
    }
    int ans = 0;
    vector<int> v;
    pair<int, int> hs = hash_str(s);
    HashedString h_t(t);
    for (int i = 0; i <= m - n; ++i) {
        pair<int, int> ht = h_t.get_hash(i, i + n);

        if (hs == ht) {
            ++ans;
            if (ans < 1000) v.push_back(i);
        }
    }
    cout << ans << "\n";
    for (int &x : v) cout << x << ' ';
    cout << "\n";
    return 0;
}