Cod sursa(job #1984602)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 25 mai 2017 14:53:15
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

vector<int> RabinKarp(const string &s, const string &pattern)
{
    vector<int> ret;
    if(s.size() < pattern.size())
        return ret;
    const int base1 = 173;
    const int base2 = 217;
    unsigned long long basePow1 = 1;
    unsigned long long patternHash1 = 0;
    unsigned long long sHash1 = 0;
    unsigned long long basePow2 = 1;
    unsigned long long patternHash2 = 0;
    unsigned long long sHash2 = 0;
    int i;
    for(i = 0; i < pattern.size(); ++i)
    {
        patternHash1 = patternHash1 * base1 + pattern[i];
        sHash1 = sHash1 * base1 + s[i];
        patternHash2 = patternHash2 * base2 + pattern[i];
        sHash2 = sHash2 * base2 + s[i];
    }
    for(int i = 1; i < pattern.size(); ++i)
    {
        basePow1 *= base1;
        basePow2 *= base2;
    }
    if(patternHash1 == sHash1 && patternHash2 == sHash2)
        ret.push_back(0);
    int start, stop;
    while(i < s.size())
    {
        start = i - pattern.size() + 1;
        stop = i;

        sHash1 -= s[start - 1] * basePow1;
        sHash1 = sHash1 * base1 + s[stop];

        sHash2 -= s[start - 1] * basePow2;
        sHash2 = sHash2 * base2 + s[stop];

        if(sHash1 == patternHash1 && sHash2 == patternHash2)
            ret.push_back(start);
        ++i;
    }
    return ret;
}

int main()
{
    ifstream in("strmatch.in");
    ofstream out("strmatch.out");
    string a, b;
    in >> a >> b;
    vector<int> sol = RabinKarp(b, a);
    out << sol.size() << "\n";
    for(auto x:sol)
        out << x << " ";
    in.close();
    out.close();
    return 0;
}