Pagini recente » Cod sursa (job #1724681) | Cod sursa (job #2077969) | Cod sursa (job #3298350) | Cod sursa (job #1594459) | Cod sursa (job #613184)
Cod sursa(job #613184)
#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=(patternHash1*Alpha+pattern[i])%Mod1;
patternHash2=(patternHash2*Beta+pattern[i])%Mod2;
sHash1=(sHash1*Alpha+s[i])%Mod1;
sHash2=(sHash2*Beta+s[i])%Mod2;
A=(A*Alpha)%Mod1;
B=(B*Beta)%Mod2;
}
if( sHash1 == patternHash1 && sHash2 == patternHash2 )
++ansSize, ans.push_back(0);
for( ; i < sSize; ++i )
{
sHash1=( (sHash1*Alpha+s[i])%Mod1-(s[i-patternSize]*A)%Mod1+Mod1 )%Mod1;
sHash2=( (sHash2*Beta+s[i])%Mod2-(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;
}