Cod sursa(job #1331736)

Utilizator andreioneaAndrei Onea andreionea Data 1 februarie 2015 06:06:29
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <string>
#include <vector>
#include <cstring>

#define BASE 73
#define MOD 666013

int main()
{
	std::string s1;
	std::string s2;
	std::ifstream f("strmatch.in");
	std::ofstream g("strmatch.out");
	std::getline(f, s1);
	std::getline(f, s2);
	f.close();
	unsigned long long hash = 0;
	for (auto &i : s1) {
		hash = (hash * BASE + i) % MOD;
	}
	unsigned long long k = 0, l = -s1.length();
	unsigned long long diff = 1;
	for (unsigned long long i = 1; i < s1.length(); ++i)
		diff = (diff * BASE) % MOD;
	unsigned long long hash2 = 0;
	int found = 0;
	std::vector<unsigned long long> sol;
	for (auto i = s2.begin(), j = s2.begin() - s1.length(); i != s2.end(); ++i, ++j) {
		if (k < s1.length() - 1) {
			hash2 = (hash2 * BASE + (*i)) % MOD;
			k++, l++;
			continue;
		}
		else if(k == (s1.length() - 1)){
			hash2 = (hash2 * BASE + (*i)) % MOD;
		}
		else {
			hash2 = (hash2 - diff * (*j) + MOD) % MOD;
			hash2 = (hash2 * BASE + (*i)) % MOD;
		}
		k++, l++;
		if (hash == hash2 && !strncmp(s1.c_str(), s2.c_str() + l, s1.length())) {
			++found;
			sol.push_back(l);
			if (found == 1000)
				break;
		}
	}
	g << found << "\n";
	for (auto &i : sol)
		g << i << " ";
	g.close();
}