Cod sursa(job #2536018)

Utilizator ViAlexVisan Alexandru ViAlex Data 1 februarie 2020 13:47:21
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include<bits/stdc++.h>
using namespace std;

#define MOD1 666013
#define MOD2 1000000007


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

string text,pattern;

void read()
{
    in>>pattern>>text;
}

int get_int(char a)
{
    return a-'A'+1;
}

void rabin_karp()
{
    int base=pow(27,pattern.length()-1);
    int basemod1=0,basemod2=0;

    vector<int> results;

    for(char a:pattern)
    {
        basemod1=(basemod1*27+get_int(a))%MOD1;
        basemod2=(basemod2*27+get_int(a))%MOD2;
    }
    int mod1=0,mod2=0;

    for(int i=0; i<pattern.length(); i++)
    {
        char here=text[i];
        mod1=(mod1*27+get_int(here))%MOD1;
        mod2=(mod2*27+get_int(here))%MOD2;
    }

    if(basemod1==mod1 && basemod2==mod2)
    {
        results.push_back(0);
    }
    char last=text[0];

    for(int i=1; i<text.length()-pattern.length()+1; i++)
    {
        mod1=(((mod1-base*get_int(last))*27)%MOD1+get_int(text[i+pattern.length()-1]))%MOD1;
        mod2=(((mod2-base*get_int(last))*27)%MOD2+get_int(text[i+pattern.length()-1]))%MOD2;

        if(mod1==basemod1 && mod2==basemod2)
        {
            results.push_back(i);
        }
        last=text[i];
    }

    out<<results.size()<<endl;
    int ending=results.size();
    ending=min(ending,1000);
    for(int i=0; i<ending; i++)
    {
        out<<results[i]<<" ";
    }


}



int main()
{
    read();
    rabin_karp();
}