Untitled

mail@pastecode.io avatar
unknown
c_cpp
23 days ago
1.8 kB
5
Indexable
Never
#include <iostream>
#include <string>
#include <vector>

using namespace std;

std::vector<uint64_t> GenAllHashes(std::string& word, uint64_t foundation, uint64_t mod) {
	std::vector<uint64_t> hash_vec;
	hash_vec.reserve(((word.size() + 1) * word.size()) / 2 ); // резерв сумма арефмитической прогрессии
	uint64_t hash = 0;
	uint64_t rand = 1;
	//std::string str;
	size_t counter = word.size();
	while (counter) {
		--counter;
		std::string str(word.substr(0, word.size() - counter)); // генерирую подстроку от первого символа длинной в один символ, каждый шаг увеливая длинну на символ
		for (int i = str.size() - 1; i >= 0; --i) {
			hash += rand * (uint64_t(str.at(i)) % mod);
			rand = (rand * foundation) % mod;
			hash_vec.push_back(hash % mod);
		}
		hash = 0;
		rand = 1;
	}
	return hash_vec;
}

int main() {
	std::ios::sync_with_stdio(false);
	uint64_t foundation, mod;
	std::cin >> foundation;
	std::cin.get();
	std::cin >> mod;
	std::cin.get();
	std::string word;
	std::getline(std::cin, word);
	std::vector<uint64_t> hash_vec(GenAllHashes(word, foundation, mod));
	int counter;
	std::cin >> counter;
	std::cin.get();
	while (counter) {
		int begin, end;
		std::cin >> begin >> end;
		std::cin.get();
		int pos_counter = (((end - 1) * end) / 2); // вычисляю соответсвующее положения хэша конечной позиции
		pos_counter += std::abs(begin - end);  // поправка положение на соответсвуюю длину
		if (!hash_vec.empty() && pos_counter < hash_vec.size()) {
			std::cout <<  hash_vec.at(pos_counter) << std::endl;
		}
		--counter;
	}
	//PrintData(hash_vec);
	return 0;
}
Leave a Comment