Cod sursa(job #3300620)

Utilizator db_123Balaban David db_123 Data 17 iunie 2025 23:43:51
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

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

#define int long long

char A[2000006];
char B[2000006];
int mod1 = 100007;
int mod2 = 100021;
vector<int> v;

int32_t main()
{
    v.reserve(1000);
    fin.getline(A, 2000006);
    fin.getline(B, 2000006);
    int na = strlen(A);
    int nb = strlen(B);
    if (na > nb) {
        fout << 0 << '\n';
        return 0;
    }
    int64_t ha1 = 0, p1 = 1;
    int64_t ha2 = 0, p2 = 1;
    for (int i = 0; i < na; i++) {
        ha1 = (ha1 * 73 + A[i]) % mod1;
        ha2 = (ha2 * 73 + A[i]) % mod2;
        if (i != 0) {
            p1 = (p1 * 73) % mod1;
            p2 = (p2 * 73) % mod2;
        }
    }
    int hb1 = 0;
    int hb2 = 0;
    for (int i = 0; i < na; i++) {
        hb1 = (hb1 * 73 + B[i]) % mod1;
        hb2 = (hb2 * 73 + B[i]) % mod2;
    }

    long long total = 0;

    if (ha1 == hb1 && ha2 == hb2) {
        total++;
        if (v.size() < 1000) v.push_back(0);
    }
    for (int i = na; i < nb; i++) {
        int val_ch_ex = (int64_t)(B[i - na] * p1) % mod1;  // ce tai
        int val_hash_atm = (hb1 - val_ch_ex + mod1) % mod1;
        hb1 = ((int64_t)val_hash_atm * 73 + B[i]) % mod1;  // adaug noul char

        val_ch_ex = (int64_t)(B[i - na] * p2) % mod2;       // ce tai
        val_hash_atm = (hb2 - val_ch_ex + mod2) % mod2;     // hash-ul cu primul char taiat
        hb2 = ((int64_t)val_hash_atm * 73 + B[i]) % mod2;   // adaug noul char

        if (ha1 == hb1 && ha2 == hb2) {
            total++;
            if (v.size() < 1000)
                v.push_back(i - na + 1);
        }
    }

    fout << total << '\n';
    for (int x : v) {
        fout << x << ' ';
    }

    return 0;
}