Cod sursa(job #446126)

Utilizator alexandru92alexandru alexandru92 Data 25 aprilie 2010 09:29:49
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
/* 
 * 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  71
#define Modulo1 1000003
#define Modulo2 1000033

/*
 * 
 */
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 )*Alpha )%Modulo1 + ss[i]  )%Modulo1;
        hss2=( ( ( ( hss2 - ( ss[i-M]*Bm1 )%Modulo2 + Modulo2 )%Modulo2 )*Beta )%Modulo2 + 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);
}