Cod sursa(job #764459)

Utilizator vitaleamaldur vitalik vitalea Data 5 iulie 2012 12:14:31
Problema Potrivirea sirurilor Scor 8
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cmath>

int hash( std::string str )
{
    int base = 101;
    int p = str.size() - 1;
    int h = 0;
    for( int i = 0; i < str.size(); i++ )
    {
        h += (int)str[i] * pow( base, p );
        p--;
    }
    return h;
}

std::vector<int> rabin_karp( std::string str, std::string sub )
{
    std::vector<int> r;
    int hsub = hash( sub );
    int hstr = hash( str.substr( 0, sub.size() ) );
    for( int i = 0; i <= str.size() - sub.size() + 1; i++ )
    {
        if( hsub == hstr )
        {
            if( str.substr( i, sub.size() ) == sub )
            {
                r.push_back( i );
            }
        }
        hstr = hash( str.substr( i + 1, sub.size() ) );
    }
    return r;
}

int main()
{
    std::ifstream in ( "strmatch.in" );
    std::ofstream out ( "strmatch.out" );
    std::string str, sub;
    in >> sub >> str;
    std::vector<int> r = rabin_karp( str, sub );
    out << r.size() << '\n';
    for( int i = 0; i < r.size(); i++ )
    {
        out << r[i] << ' ';
    }
    in.close();
    out.close();
    return 0;
}