Cod sursa(job #1817968)

Utilizator relu.draganDragan Relu relu.dragan Data 28 noiembrie 2016 18:34:25
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
string pattern, text;
vector<int> lps;
vector<int> positions;
int nrFound;
void buildLps()
{
    lps[0] = 0;
    int i, j;
    i = 1; 
    j = 0;
    while (i < pattern.size())
    {
        if (pattern[i] == pattern[j]) {
            lps[i] = j + 1;
            i++;
            j++;
        }
        else {
            if (j > 0) {
                j = lps[j - 1];
            }
            else {
                lps[i] = 0;
                i++;
            }
        }

    }
}
void KMPsearch()
{
    int i = 0;
    int j = 0;
    while (i < text.size()) {
        if (text[i] == pattern[j]) {
            i++;
            j++;
        } 
        if (j == pattern.size()) {
            if (positions.size() < 1000)
                positions.push_back(i - j);
            nrFound++;
            j = lps[j - 1];
        }
        else if (i < text.size() && text[i] != pattern[j]) {
            if (j != 0) {
                j = lps[j - 1];
            } else {
                i++;
            }
        }
    }

}
int main()
{
    getline(in, pattern);
    getline(in, text);
    lps.resize(pattern.size());
    nrFound = 0;
    buildLps();
/*    for (int i = 0; i < lps.size(); i++) {
        cout << lps[i] << " ";
    }
    cout << "\n";*/
    KMPsearch();
    out << nrFound << "\n";
    for (int i = 0; i < positions.size(); i++) {
        out << positions[i] <<" ";
    }
    return 0;


}