Cod sursa(job #2433809)

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

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

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;
}