Cod sursa(job #3158656)

Utilizator ililogIlinca ililog Data 19 octombrie 2023 16:28:05
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<cstring>
#define MAXN 2000001
#define P 73
#define MOD1 100007
#define MOD2 100021

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

char A[MAXN], B[MAXN];
int NA, NB;

int hashA1, hashA2, P1, P2;

char match[MAXN];

int main() {
    
    fin >> A >> B;
    NA = strlen(A), NB = strlen(B);
    
    if (NA > NB) {
        fout << "0";
        return 0;
    }
    
    P1 = P2 = 1;
    for (int i = 0; i<NA; i++) {
        hashA1 = (hashA1*P + A[i]) % MOD1;
        hashA2 = (hashA2*P + A[i]) % MOD2;
        
        if (i != 0) {
            P1 = (P1 * P) % MOD1;
            P2 = (P2 * P) % MOD2;
        }
    }
    
    int hash1 = 0, hash2 = 0;
    for (int i = 0; i<NA; i++) {
        hash1 = (hash1*P + B[i]) % MOD1;
        hash2 = (hash2*P + B[i]) % MOD2;
    }
    
    int nr = 0;
    if (hash1 == hashA1 && hash2 == hashA2) {
        match[0] = 1;
        nr++;
    }
    
    for (int i = NA; i<NB; i++) {
        hash1 = ((hash1 - (B[i-NA] * P1) % MOD1 + MOD1) * P + B[i]) % MOD1;
        hash2 = ((hash2 - (B[i-NA] * P2) % MOD2 + MOD2) * P + B[i]) % MOD2;
        
        if (hash1 == hashA1 && hash2 == hashA2) {
            match[i-NA+1] = 1;
            nr++;
        }
    }
    fout << nr << "\n";
    nr = 0;
    
    for (int i = 0; i<NB && nr < 1000; i++) {
        if (match[i]) {
            nr++;
            fout << i << " ";
        }
    }
    
    return 0;
}