Cod sursa(job #1586039)

Utilizator sebii_cSebastian Claici sebii_c Data 31 ianuarie 2016 18:24:11
Problema Potrivirea sirurilor Scor 8
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 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 = -1;
    for (auto i = 1; i < s.size(); ++i) {
	while (k >= 0 && s[k + 1] != s[i])
	    k = pi[k];
	if (s[k + 1] == 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);
    int q = -1;
    int n = static_cast<int>(s.size());
    vector<int> result;
    for (auto i = 0; i < t.size(); ++i) {
	while (q >= 0 && s[q + 1] != t[i])
	    q = pi[q];
	if (s[q + 1] == t[i])
	    q++;
	if (q == n - 1)
	    result.push_back(i - n + 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;
}