Cod sursa(job #613184)

Utilizator BitOneSAlexandru BitOne Data 17 septembrie 2011 20:58:04
Problema Potrivirea sirurilor Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#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;
}