Cod sursa(job #1764160)

Utilizator sulzandreiandrei sulzandrei Data 25 septembrie 2016 03:14:58
Problema Potrivirea sirurilor Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <string>
#include <vector>
#include <algorithm>
#include <limits>
using namespace std;

ifstream in("strmatch.in");
ofstream out("strmatch.out");

void Rabin_Karp(string &T, string &P, vector<int> &pos)
{
    if(P.size()> T.size())
        return;
    int base = 101,prime = 14107,hpattern = 0,hs = 0;
    prime  = numeric_limits<int>::max();

    int n = T.length();
    int m = P.length();

    int power[m];
    power[0] = 1;
    for(int i = 1;  i < m ; i ++)
        power[i] = (power[i-1]*base) % prime;

    for(int i = 0 ; i < m ; i++)
    {
        hpattern = ( hpattern + power[ m-1 - i] * P[ i ] ) % prime,
        hs = (hs +  power[m-1 -i]*T[i]) % prime;
    }
    bool ok  = true;
    for(int s = 0 ; s <= n-m  ; s++)
    {
        if (hs == hpattern)
        {
            ok = true;
            for(int i = 0 ; i < m ;  i ++)
                if (P[i] != T[s+i])
                    ok = false;
            if(ok)
                pos.push_back(s);
        }
        if(s < n-m)//update hash(rolling hash)
            hs = ( base *(hs - T[s] * power[m-1])  + T[ s + m ] ) % prime;
    }
}
int main()
{
    vector< int > pos;
    string T,P;
    in >> P >> T;
    Rabin_Karp(T,P,pos);
    out<<pos.size()<<'\n';
    for( int i = 0;i < min(1000,(int)pos.size());i++)
        out<<pos[i]<<" ";
    return 0;
}