Cod sursa(job #2734044)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 31 martie 2021 12:07:29
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream f("strmatch.in");
ofstream g("strmatch.out");

string text, pattern;

vector < int > RabinKarp(const string &text, const string &pattern)
{
    const int base1 = 199;
    const int mod1 = 666013;

    const int base2 = 211;
    const int mod2 = 1000000007;

    vector < int > ans;

    int p1 = 1;
    int p2 = 1;

    int h1pattern = 0;
    int h2pattern = 0;

    int h1text = 0;
    int h2text = 0;

    for (int i = 0; i < pattern.size(); i++)
    {
        h1pattern = (1LL * h1pattern * base1 + pattern[i]) % mod1;
        h2pattern = (1LL * h2pattern * base2 + pattern[i]) % mod2;

        h1text = (1LL * h1text * base1 + text[i]) % mod1;
        h2text = (1LL * h2text * base2 + text[i]) % mod2;

        if (i > 0)
        {
            p1 = (1LL * p1 * base1) % mod1;
            p2 = (1LL * p2 * base2) % mod2;
        }
    }

    if (h1pattern == h1text && h2pattern == h2text)
        ans.push_back(0);

    for (int i = pattern.size(); i < text.size(); i++)
    {
        h1text = (1LL * h1text + mod1 - (1LL * p1 * text[i - pattern.size()]) % mod1) % mod1;
        h1text = (1LL * h1text * base1 + text[i]) % mod1;

        h2text = (1LL * h2text + mod2 - (1LL * p2 * text[i - pattern.size()]) % mod2) % mod2;
        h2text = (1LL * h2text * base2 + text[i]) % mod2;

        if (h1pattern == h1text && h2pattern == h2text)
            ans.push_back(i - pattern.size() + 1);
    }

    return ans;
}

int main()
{
    f >> pattern >> text;

    vector < int > ans = RabinKarp(text, pattern);

    g << ans.size() << "\n";
    for (int i = 0; i < ans.size() && i < 1000; i++)
        g << ans[i] << " ";

    return 0;
}