Cod sursa(job #997317)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 13 septembrie 2013 18:34:03
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <ctime>

using namespace std;

const int base = 73;
const int MOD1 = 100007;
const int MOD2 = 100021;

const int Nmax = 2000005;

char Pattern[Nmax], Text[Nmax];
int match[Nmax];

int HashPattern, HashText;
int HashPattern1, HashText1;
int base1 = 1, base2 = 1;
int P, T, contor;

void read()
{
    ifstream f("strmatch.in");

    f.getline( Pattern, Nmax );
    f.getline( Text, Nmax );

    P = strlen( Pattern );
    T = strlen( Text );

    f.close();
}

void calc_hash()
{
    for ( int i = 0; i < P; ++i )
    {
        HashPattern  = ( HashPattern  * base + Pattern[i] ) % MOD1;
        HashPattern1 = ( HashPattern1 * base + Pattern[i] ) % MOD2;

        if ( i > 0 )
        {
            base1 = ( base1 * base ) % MOD1;
            base2 = ( base2 * base ) % MOD2;
        }
    }

    for ( int i = 0; i < P; ++i )
    {
        HashText  = ( HashText  * base + Text[i] ) % MOD1;
        HashText1 = ( HashText1 * base + Text[i] ) % MOD2;
    }
}

void Rabin_Karp()
{
    if ( HashPattern == HashText && HashPattern1 == HashText1 )
            match[0] = 1;

    for ( int i = P; i < T; ++i )
    {
        HashText  = ( ( HashText -  ( Text[i - P] * base1 ) % MOD1 + MOD1 ) * base + Text[i] ) % MOD1;
        HashText1 = ( ( HashText1 - ( Text[i - P] * base2 ) % MOD2 + MOD2 ) * base + Text[i] ) % MOD2;

        if ( HashPattern == HashText && HashPattern1 == HashText1 )
                match[i - P + 1] = 1;
    }
}

void print()
{
    ofstream g("strmatch.out");

    for ( int i = 0; i < T; ++i )
            contor += match[i];

    g << contor << "\n";

    contor = 0;

    for ( int i = 0; i < T; ++i )
    {
        if ( match[i] )
        {
            g << i << " ";
            contor++;

            if ( contor == 1000 )
                    break;
        }
    }

    g.close();
}

int main()
{
    read();
    calc_hash();
    Rabin_Karp();
    print();

    return 0;
}