Cod sursa(job #1226895)

Utilizator rockerboyHutter Vince rockerboy Data 9 septembrie 2014 00:36:59
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <string>
#include <vector>

using namespace std;

void precomp (std::string s, std::vector<int>& v)
{
    int len = s.length();
    v.resize(len);
    v[0] = 0;
    for (int i=1; i<len; i++) {
        if (s[v[i-1]] == s[i]) {
            v[i] = v[i-1] +1;
        }
        else {
            v[i] = 0;
            if (s[i] == s[0]) v[i] = 1;
        }
    }
}

void to_upper (std::string& s)
{
    for (std::string::iterator i=s.begin(); i<s.end(); i++) {
        if (*i >= 97) *i -= 32;
    }
}

int main()
{
    ifstream in("strmatch.in");
    ofstream out("strmatch.out");
    string pattern, text;
    in >> pattern >> text;
    to_upper (pattern);
    to_upper (text);

    vector<int> x;
    precomp(pattern, x);

    int len = text.length(), j=0, pattlen = pattern.length();
    vector<int> results;

    for (int i=0; i<len; i++) {
        if (text[i] == pattern[j]) {
            j++;
        }
        else {
            j = x[j-1];
        }
        if (j==pattlen) {
            results.push_back(i-pattlen+1);
            j = x[j-1];
            if (results.size() == 1000) break;
        }
    }

    out << results.size() << "\n";

    for (vector<int>::iterator i=results.begin(); i<results.end(); i++) {
        out << *i << " ";
    }

    for (int i=0; i<x.size(); i++) {
        out << x[i];
    }
}