Cod sursa(job #2931504)

Utilizator matthriscuMatt . matthriscu Data 31 octombrie 2022 11:39:31
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <bits/stdc++.h>
using namespace std;

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

    string needle, haystack;
	fin >> needle >> haystack;

	vector<size_t> prefix(needle.size());

	prefix[0] = 0;
	size_t i = 1, j = 0;

	for (size_t i = 1, j = 0; i < needle.size(); ++i) {
		while (j && needle[i] != needle[j])
			j = prefix[j - 1];

		j += (needle[i] == needle[j]);
		prefix[i] = j;
	}

	vector<size_t> ans;
	for (size_t i = 0, j = 0; i < haystack.size(); ++i) {
		while (j && haystack[i] != needle[j])
			j = prefix[j - 1];

		j += (haystack[i] == needle[j]);
		
		if (j == needle.size()) {
			j = prefix[j - 1];
			ans.push_back(i + 1 - needle.size());
		}
	}

	fout << ans.size() << '\n';
	for (auto it = ans.begin(); it != ans.end() && it != ans.begin() + 1000; ++it)
		fout << *it << ' ';
	fout << '\n';
}