Cod sursa(job #2232006)

Utilizator gabrielxCojocaru Gabriel-Codrin gabrielx Data 16 august 2018 23:19:32
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
#include <string>

using namespace std;

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

string pattern, text, zString;
vector<int> Z(4000001);
int patternApparitions = 0;

void buildZArray() {
	int L, R;

	L = R = 0;
	for (int i = 1; i < zString.size(); ++i) {
		if (i > R) {
			int count = 0;
			L = R = i;

			while (i + count < zString.size() && zString[count] == zString[i + count]) {
				count++;
			}

			Z[i] = count;

			if (count != 0) {
				R = R + count - 1;
			}
		} else {
			int k = i - L;

			if (Z[k] < R - i + 1) {
				Z[i] = Z[k];
			}
			else {
				int count = 0;
				L = i;

				while (R + count + 1 < zString.size() && zString[R - i + 1 + count] == zString[R + count + 1]) {
					count++;
				}

				R = R + count;
				Z[i] = R - L + 1;
			}
		}

		if (Z[i] == pattern.size()) {
			patternApparitions++;
		}
	}
}

int main() {
	getline(fin, pattern);
	getline(fin, text);

	zString = pattern + "$" + text;
	buildZArray();

	fout << patternApparitions << '\n';

	int count = 0;
	for (int i = 0; i < zString.size(); ++i) {
		if (Z[i] == pattern.size()) {
			fout << i - pattern.size() - 1 << ' ';
			count++;

			if (count == 1000) {
				return 0;
			}
		}
	}

	return 0;
}