Cod sursa(job #2142228)

Utilizator rares96cheseliRares Cheseli rares96cheseli Data 24 februarie 2018 21:09:38
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

#define NMAX 2000005
#define MOD1 1000003
#define MOD2 10003
#define BASE 73

using namespace std;

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

int log_pow(int base, int expo, int mod) {
	int res = 1;
	while (expo) {
		if (expo & 1) {
			res = (1LL * res * base) % mod;
		}

		base = (1LL * base * base) % mod;
		expo >>= 1;
	}

	return res;
}

int main() {
	int limit, N, power1, power2;
	int strHash1 = 0, strHash2 = 0;
	int patternHash1 = 0, patternHash2 = 0;
	
	vector <int> sol;
	string text, pattern;

	fin >> pattern >> text;
	N = pattern.size();
	power1 = log_pow(BASE, N - 1, MOD1);
	power2 = log_pow(BASE, N - 1, MOD2);

	for (int i = 0; i < N; ++i) {
		patternHash1 = (patternHash1 * BASE + pattern[i]) % MOD1;
		patternHash2 = (patternHash2 * BASE + pattern[i]) % MOD2;

		strHash1 = (strHash1 * BASE + text[i]) % MOD1;
		strHash2 = (strHash2 * BASE + text[i]) % MOD2;
	}

	if (strHash1 == patternHash1 && strHash2 == patternHash2) {
		sol.push_back(0);
	}

	for (int i = N; i < (int)text.size(); ++i) {
		strHash1 = ((strHash1 - (power1 * text[i - N]) % MOD1 + MOD1) * BASE + text[i]) % MOD1;
		strHash2 = ((strHash2 - (power2 * text[i - N]) % MOD2 + MOD2) * BASE + text[i]) % MOD2;
	
		if (strHash1 == patternHash1 && strHash2 == patternHash2) {
			sol.push_back(i - N + 1);
		}
	}

	limit = min((int)sol.size(), 1000);
	fout << sol.size() << '\n';
	for (int i = 0; i < limit; ++i) {
		fout << sol[i] << ' ';
	}

	return 0;
}