Pagini recente » Cod sursa (job #2874771) | Cod sursa (job #2788130) | Cod sursa (job #165697) | Cod sursa (job #1951872) | Cod sursa (job #2536018)
#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();
}