Cod sursa(job #1586040)

Utilizator sebii_cSebastian Claici sebii_c Data 31 ianuarie 2016 18:27:28
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <string>
#include <vector>

using namespace std;

/**@brief Find prefixes of s that match suffixes of s_i
 */
vector<int> prefix(const string& s) {
    vector<int> pi(s.size());
    int k = 0;
    for (auto i = 1; i < s.size(); ++i) {
	while (k > 0 && s[k] != s[i])
	    k = pi[k - 1];
	if (s[k] == s[i])
	    k++;
	pi[i] = k;
    }

    return pi;
}

/**@brief Find matches of s in t.
 *
 * Implements the Knuth-Morris-Pratt pattern matching algorithm.
 */
vector<int> match(const string& s, const string& t) {
    auto pi = prefix(s);
    size_t q = 0;

    vector<int> result;
    for (size_t i = 0; i < t.size(); ++i) {
	while (q > 0 && s[q] != t[i])
	    q = pi[q - 1];
	if (s[q] == t[i])
	    q++;
	if (q == s.size())
	    result.push_back(i - s.size() + 1);
    }

    return result;
}

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

    string s, t;
    fin >> s >> t;
    auto result = match(s, t);
    fout << result.size() << endl;
    for (int i = 0; i < min(1000, static_cast<int>(result.size())); ++i) {
	fout << result[i] << " ";
    }
    fout << endl;
    
    return 0;
}