Pagini recente » Cod sursa (job #1940946) | Cod sursa (job #446129)
Cod sursa(job #446129)
/*
* File: main.cpp
* Author: virtualdemon
*
* Created on April 24, 2010, 7:39 PM
*/
#include <string>
#include <vector>
#include <cstdlib>
#include <fstream>
#include <iterator>
#define Alpha 41
#define Beta 73
#define Modulo1 1000003
#define Modulo2 1000037
/*
*
*/
using namespace std;
string pattern, ss;
vector< size_t > match;
inline void PatternMatch( size_t N, size_t M )
{
size_t i, Am1, Bm1, hp, hp2, hss, hss2;
for( Am1=Bm1=1, hp=hp2=hss=hss2=i=0; i < M; ++i )
{
hp=( hp*Alpha + pattern[i] )%Modulo1;
hp2=( hp2*Beta + pattern[i] )%Modulo2;
hss=( hss*Alpha + ss[i] )%Modulo1;
hss2=( hss2*Beta + ss[i] )%Modulo2;
if( i )
{
Am1=(Am1*Alpha)%Modulo1;
Bm1=(Bm1*Beta)%Modulo2;
}
}
if( hp == hss && hp2 == hss2 )
match.push_back( 0 );
for( ; i < N; ++i )
{
hss=( hss - ( ss[i-M]*Am1 )%Modulo1 + Modulo1 )%Modulo1;
hss=( hss*Alpha + ss[i] )%Modulo1;
hss2=( hss2 - ( ss[i-M]*Bm1 )%Modulo2 + Modulo2 )%Modulo2;
hss2=( hss2*Beta + ss[i] )%Modulo2;
if( hp == hss && hp2 == hss2 )
match.push_back( i-M+1 );
}
}
inline int min( size_t x, size_t y )
{
if( x < y )
return x;
return y;
}
int main(int argc, char** argv)
{
ifstream in( "strmatch.in" );
ofstream out( "strmatch.out" );
in>>pattern>>ss;
PatternMatch( ss.size(), pattern.size() );
out<<match.size()<<'\n';
copy( match.begin(), match.begin()+min( 1000, match.size() ), ostream_iterator<size_t>( out, " " ) );
return (EXIT_SUCCESS);
}