Cod sursa(job #2433817)

Utilizator mihai2003LLL LLL mihai2003 Data 29 iunie 2019 11:24:17
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <vector>

class str_search{
    std::string pattern,text;
    std::vector<int>pos;
    const static int d=90;
    const static int MOD=100007;
    const static int MOD1=100021;
public:
    str_search(){}
    str_search(std::string a,std::string b):pattern(a),text(b){}
    void search(std::ofstream& out){
        int64_t th=0,ph=0,h=1,h1=1,th1=0,ph1=0;
        if(pattern.size()>text.size()){
            out<<0;
            return;
        }
        for(int i=0;i<pattern.size()-1;i++)
            h=(h*d)%MOD,h1=(h1*d)%MOD1;
        for(int i=0;i<pattern.size();i++)
            th=(d*th+text[i])%MOD,ph=(d*ph+pattern[i])%MOD,
            th1=(d*th1+text[i])%MOD1,ph1=(d*ph1+pattern[i])%MOD1;
        for(int i=0;i<text.size()-pattern.size()+1;i++){
            if(th==ph && th1==ph1)
                pos.push_back(i);
            th=(d*(th-text[i]*h)+text[i+pattern.size()])%MOD;
           th1=(d*(th1-text[i]*h1)+text[i+pattern.size()])%MOD1;
            if(th<0)
                th+=MOD;
            if(th1<0)
                th1+=MOD1;
        }
        out<<pos.size()<<'\n';
        for(int i=0;i<std::min((std::size_t)1000,pos.size());i++)
            out<<pos[i]<<" ";
    }
};

std::ifstream in("strmatch.in");
std::ofstream out("strmatch.out");
std::string pat,txt;
int main(){
    in>>pat>>std::ws>>txt;
    str_search(pat,txt).search(out);
    return 0;
}