Pagini recente » Cod sursa (job #332262) | Cod sursa (job #3134836) | Cod sursa (job #2123675) | Profil StefanCenusa | Cod sursa (job #613212)
Cod sursa(job #613212)
#include <vector>
#include <string>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define Alpha 31
#define Beta 67
#define Mod1 34636831
#define Mod2 16025969
using namespace std;
string s, pattern;
vector< int > ans;
int sSize, patternSize, ansSize;
void RabinKarp()
{
int patternHash1, patternHash2, sHash1, sHash2, A, B, i;
A=B=1;
patternHash1=patternHash2=sHash1=sHash2=0;
for( i=0; i < patternSize; ++i )
{
patternHash1=(1LL*patternHash1*Alpha+pattern[i])%Mod1;
patternHash2=(1LL*patternHash2*Beta+pattern[i])%Mod2;
sHash1=(1LL*sHash1*Alpha+s[i])%Mod1;
sHash2=(1LL*sHash2*Beta+s[i])%Mod2;
A=(1LL*A*Alpha)%Mod1;
B=(1LL*B*Beta)%Mod2;
}
if( sHash1 == patternHash1 && sHash2 == patternHash2 )
++ansSize, ans.push_back(0);
for( ; i < sSize; ++i )
{
sHash1=( (1LL*sHash1*Alpha+s[i])%Mod1-(1LL*s[i-patternSize]*A)%Mod1+Mod1 )%Mod1;
sHash2=( (1LL*sHash2*Beta+s[i])%Mod2-(1LL*s[i-patternSize]*B)%Mod2+Mod2 )%Mod2;
if( sHash1 == patternHash1 && sHash2 == patternHash2 )
{
++ansSize;
if( 1000 >= ansSize )
ans.push_back(i-patternSize+1);
}
}
}
int main( void )
{
ifstream in( "strmatch.in" );
getline( in, pattern );
getline( in, s );
patternSize=pattern.size();
sSize=s.size();
RabinKarp();
ofstream out( "strmatch.out" );
out<<ansSize<<'\n';
copy( ans.begin(), ans.end(), ostream_iterator<int>( out, " " ) );
out<<'\n';
return EXIT_SUCCESS;
}