Cod sursa(job #1790474)

Utilizator preda.andreiPreda Andrei preda.andrei Data 28 octombrie 2016 11:57:33
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <string>
#include <vector>

using namespace std;

vector<int> AflaPrefix(const string &s)
{
    vector<int> prefix(s.size(), 0);
    int lung = 0;

    for (unsigned i = 1; i < s.size(); ++i) {
        while (lung > 0 && s[i] != s[lung])
            lung = prefix[lung - 1];
        if (s[i] == s[lung])
            ++lung;
        prefix[i] = lung;
    }
    return prefix;
}

vector<int> AflaPotriviri(const string &sir, const string &model, int &nr_rasp)
{
    auto prefix = AflaPrefix(model);
    vector<int> pozitii;
    nr_rasp = 0;

    unsigned lung = 0;
    for (unsigned i = 0; i < sir.size(); ++i) {
        while (lung > 0 && sir[i] != model[lung])
            lung = prefix[lung - 1];
        if (sir[i] == model[lung])
            ++lung;
        if (lung == model.size()) {
            ++nr_rasp;
            if (pozitii.size() < 1000)
                pozitii.push_back(i - lung + 1);
        }
    }
    return pozitii;
}

int main()
{
    ifstream fin("strmatch.in");
    ofstream fout("strmatch.out");

    string cautat;
    getline(fin, cautat);

    string sir;
    getline(fin, sir);

    int nr_potriviri = 0;
    auto pozitii = AflaPotriviri(sir, cautat, nr_potriviri);
    fout << nr_potriviri << "\n";
    for (int poz : pozitii)
        fout << poz << " ";

    return 0;
}