Cod sursa(job #2984308)

Utilizator florinrafiliuRafiliu Florin florinrafiliu Data 23 februarie 2023 21:29:08
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

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

const int mod1 = 1e9 + 7;
const int mod2 = 1e9 + 9;

vector <int> ans;

int main()
{

    string pattern; fin >> pattern;
    string sir; fin >> sir;


    int power1 = 1, power2 = 1;
    for(int i = 1; i < pattern.size(); i++) {
        power1 = 1ll * power1 * 31 % mod1;
        power2 = 1ll * power2 * 29 % mod2;
    }

    int Hash1 = 0, Hash2 = 0;
    for(int i = 0; i < pattern.size(); i++) {
        Hash1 = 1ll * (1ll * Hash1 * 31 + 1ll * (pattern[i]-'A'+1)) % mod1;
        Hash2 = 1ll * (1ll * Hash2 * 29 + 1ll * (pattern[i]-'A'+1)) % mod2;
    }

    int H1 = 0, H2 = 0;
    for(int i = 0; i < pattern.size(); i++) {
        H1 = 1ll * (1ll * H1 * 31 + 1ll * (sir[i]-'A'+1)) % mod1;
        H2 = 1ll * (1ll * H2 * 29 + 1ll * (sir[i]-'A'+1)) % mod2;
    }

    if(H1 == Hash1 && H2 == Hash2)
        ans.push_back(pattern.size());

    for(int i = pattern.size(); i < sir.size(); i++) {
        H1 = H1 - (sir[i-pattern.size()]-'A'+1) * power1;
        if(H1 < 0) H1 += mod1;
        H1 = (1ll * H1 * 31 % mod1 + (sir[i]-'A'+1)) % mod1;

        H2 = H2 - (sir[i-pattern.size()]-'A'+1) * power2;
        if(H2 < 0) H2 += mod2;
        H2 = (1ll * H2 * 29 % mod2 + (sir[i]-'A'+1)) % mod2;

        if(H1 == Hash1 && H2 == Hash2)
            ans.push_back(i);
    }

    fout << ans.size() << "\n";
    for(int i = 0; i < min(1000, (int) ans.size()); i++)
        fout << ans[i] - pattern.size() + 1 << " ";

    return 0;
}