Cod sursa(job #2536243)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 1 februarie 2020 17:45:49
Problema Potrivirea sirurilor Scor 32
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>


const int MOD1 = 1e9 + 7;
const int MOD2 = 104729;
const int baza = 54;

using namespace std;

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

long long amod1,amod2,bmod1,bmod2;
int n,m;
long long pown_MOD1,pown_MOD2;

int asci(char c){
    return c - 'A' + 1;
}
string str(int nr){
    string ans;
    while(nr){
        ans += (nr % baza + 'A' - 1);
        nr /= baza;
    }
    reverse(ans.begin(),ans.end());
    return ans;
}

int main()
{
    string a,b;
    in>>a>>b;
    int n = a.size();
    int m = b.size();
    pown_MOD1 = pown_MOD2 = 1;
    for(int i = 1; i <= n - 1; i++){
        pown_MOD1 = pown_MOD1 * baza % MOD1;
        pown_MOD2 = pown_MOD2 * baza % MOD2;
    }
    for(int i = 0; i < n; i++){
        amod1 = (amod1 * baza + asci(a[i])) % MOD1;
        amod2 = (amod2 * baza + asci(a[i])) % MOD2;
    }
    for(int i = 0; i < n; i++){
        bmod1 = (bmod1 * baza + asci(b[i])) % MOD1;
        bmod2 = (bmod2 * baza + asci(b[i])) % MOD2;
    }


    vector<int>ans;
    if(amod1 == bmod1 && amod2 == bmod2)
        ans.push_back(0);
    for(int i = n; i < m; i++){
        bmod1 = ((bmod1 - asci(b[i - n]) * pown_MOD1) * baza + asci(b[i])) % MOD1;
        bmod1 = (bmod1 + MOD1) % MOD1;
        bmod2 = ((bmod2 - asci(b[i - n]) * pown_MOD2) * baza + asci(b[i])) % MOD2;
        bmod2 = (bmod2 + MOD2) % MOD2;
        if(amod1 == bmod1 && amod2 == bmod2)
            ans.push_back(i - n + 1);
    }

    out<<ans.size()<<"\n";
    for(auto i : ans)
        out<<i<<" ";

    return 0;
}