Cod sursa(job #1895413)

Utilizator TamasFlorin96Tamas Florin TamasFlorin96 Data 27 februarie 2017 22:31:25
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>

std::vector<int> pattern(std::string s) {	
	std::vector<int> result(s.size(), 0);

	int j = 0;

	for(size_t i=1;i<s.size();i++){

		while (s[i] != s[j] && j > 0) {
			j = result[j - 1];
		}

		if (s[i] == s[j]) j++;

		result[i] = j;
	}

	return result;
}

std::vector<int> kmp(std::string needle,std::string haystack) {

	std::vector<int> p = pattern(needle);
	std::vector<int> solution;

	size_t j = 0;

	for(size_t i = 0;i<haystack.size();i++){

		while (haystack[i] != needle[j] && j>0)
			j = p[j - 1];

		if (haystack[i] == needle[j])
			j++;

		if (j == needle.size()) {
			solution.push_back(i - needle.size() + 1);
		}
	}

	return solution;
}

int main(void) {

	std::ifstream in("strmatch.in");
	std::string needle;
	std::string haystack;

	in >> needle >> haystack;

	in.close();

	std::ofstream out("strmatch.out");

	auto sol = kmp(needle, haystack);

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

	for (int i = 0; i < std::min(1000, (int)sol.size()); i++) {
		out << sol[i] << " ";
	}
	
	out.close();

	return 0;
}