Cod sursa(job #2723588)

Utilizator vladm98Munteanu Vlad vladm98 Data 14 martie 2021 23:49:06
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <string>
#include <fstream>

using namespace std;
long long hashValue[2000005];
long long v[2000005];
long long multiplier[20000005];

long long MOD = 666013;

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

    string pattern, text;
    fin >> pattern >> text;

    long long n, m, sumPattern = 0, r = 237, k = 0, cnt = 0;
    n = text.size();
    m = pattern.size();
    if (n < m) {
        fout << 0;
        return 0;
    }
    multiplier[0] = 1;

    for (int i = 1; i < m; ++i) {
        multiplier[i] = ((r % MOD) * multiplier[i - 1]) % MOD;
    }


    for (int i = 0; i < m; ++i) {
        char y = pattern.at(i);
        char x = text.at(i);
        sumPattern += (((int(y))% MOD) * multiplier[m - i - 1]) % MOD;
        sumPattern %= MOD;
        k += (((int(x))% MOD) * multiplier[m - i - 1]) % MOD;
        k %= MOD;
    }
    hashValue[0] = k;


    for (int i = 0; i < n; ++i) {
        char x = text.at(i);
        v[i] = int(x);
    }

    for (int i = 1; i < n - m + 1; ++i) {
        hashValue[i] = ((hashValue[i - 1] - ((v[i - 1] % MOD) * multiplier[m - 1]) % MOD) * r) % MOD + v[i+m-1] % MOD;
        hashValue[i] += MOD;
        hashValue[i] %= MOD;
    }

    for (int i = 0; i < n - m + 1; ++i) {
        if(sumPattern == hashValue[i]) {
            cnt += 1;
        }
    }
    fout << cnt << "\n";

    cnt = 0;
    for (int i = 0; i < n - m + 1; ++i) {
        if(sumPattern == hashValue[i]) {
            if (cnt < 1000) {
                cnt += 1;
                fout << i << " ";
            }
        }
    }


    return 0;
}