Cod sursa(job #1526800)

Utilizator sunt_emoSunt emo sunt_emo Data 17 noiembrie 2015 12:31:46
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <vector>

int main()
{
	std::ifstream in("strmatch.in");
	std::string data, key;
	in >> key >> data;
	std::vector<int> results;
	
	if (key.size() <= data.size())
	{
		int base = 257, m = 1000007;
		int key_hash = 0, rolling_hash = 0;
		int p = 1;
		for (unsigned i = 0; i < key.size(); i++)
		{
			key_hash = (key_hash * base + key[i]) % m;
			rolling_hash = (rolling_hash * base + data[i]) % m;
			p = (p * base) % m;
		}
		
		for (unsigned i = key.size(); i < data.size(); i++)
		{
			if (key_hash == rolling_hash)
				results.push_back(i - key.size());
			rolling_hash = (rolling_hash * base + data[i]) % m;
			rolling_hash -= (p * data[i - key.size()]) % m;
			if (rolling_hash < 0)
				rolling_hash += m;
		}
		if (key_hash == rolling_hash)
			results.push_back(data.size() - key.size());
	}

	std::ofstream out("strmatch.out");
	out << results.size() << '\n';
	unsigned s = std::min(1000, static_cast<int>(results.size()));
	for (int i = 0; i < s; i++)
		out << results[i] << ' ';
	out << '\n';
}