Pagini recente » Cod sursa (job #660422) | Cod sursa (job #1819804) | Cod sursa (job #1339274) | Cod sursa (job #2166685) | Cod sursa (job #2433817)
#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;
}