Cod sursa(job #3004215)

Utilizator dariustgameTimar Darius dariustgame Data 16 martie 2023 10:39:27
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const long long mod1 = 1000000007;
const long long mod2 = 1000000080;
const long long baza1 = 250;
const long long baza2 = 200;
long long power1 = 1, power2 = 1;


int hashh(string s, long long mod, long long baza)
{
    long long r = 0;
    for (long long i = 0; i < s.size(); i++)
    {
        r = r * baza + s[i];
        r %= mod;
    }
    return r;
}

vector<long long> poz;

void rabin_karp(string sir, string pat)
{
    long long cnt = 0;
    long long h1 = hashh(pat, mod1, baza1);
    long long h2 = hashh(pat, mod2, baza2);
    long long hh1 = 0;
    long long hh2 = 0;
    for (long long i = 0; i < pat.size(); i++)
    {
        power1 = (power1 * baza1) % mod1;
        power2 = (power2 * baza2) % mod2;
    }
    for (long long i = 0; i < sir.size(); i++)
    {
        hh1 = hh1 * baza1 + sir[i];
        hh1 %= mod1;
        hh2 = hh2 * baza2 + sir[i];
        hh2 %= mod2;
        if (i >= pat.size())
        {
            hh1 -= (power1 * sir[i - pat.size()]) % mod1;
            if (hh1 < 0)
            {
                hh1 += mod1;
            }
            hh2 -= (power2 * sir[i - pat.size()]) % mod2;
            if (hh2 < 0)
            {
                hh2 += mod2;
            }
        }
        if (i >= pat.size() - 1 && hh1 == h1 && hh2 == h2)
        {
            cnt++;
            poz.push_back(i - (pat.size() - 1));
        }
    }
    fout << cnt << '\n';
    int len = min(1000, (int)poz.size());
    for (long long i = 0; i < len; i++)
    {
        fout << poz[i] << ' ';
    }
}


int main()
{
    string sir, pat;
    fin >> pat >> sir;
    rabin_karp(sir, pat);
    return 0;
}