12tqian's Competitive Programming Library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub 12tqian/cp-library

:heavy_check_mark: library/string/manacher.hpp

Verified with

Code

#pragma once

std::vector<int> manacher(std::string s) {
	std::string t = "@";
	for (auto& c : s) 
		t += c, t += '#';
	t.back() = '&';
	std::vector<int> res((int)t.size() - 1);
	int lo = 0, hi = 0;
	for (int i = 1; i < (int)t.size() - 1; i++) {
		if (i != 1)
			res[i] = std::min(hi - i, res[hi - i + lo]);
		while (t[i - res[i] - 1] == t[i + res[i] + 1])
			res[i]++;
		if (i + res[i] > hi)
			lo = i - res[i], hi = i + res[i];
	}
	res.erase(res.begin());
	for (int i = 0; i < (int)res.size(); i++)
		if ((i & 1) == (res[i] & 1))
			res[i]++;
	return res;
}
std::vector<int> manacher(std::string s) {
	std::string t = "@";
	for (auto& c : s) 
		t += c, t += '#';
	t.back() = '&';
	std::vector<int> res((int)t.size() - 1);
	int lo = 0, hi = 0;
	for (int i = 1; i < (int)t.size() - 1; i++) {
		if (i != 1)
			res[i] = std::min(hi - i, res[hi - i + lo]);
		while (t[i - res[i] - 1] == t[i + res[i] + 1])
			res[i]++;
		if (i + res[i] > hi)
			lo = i - res[i], hi = i + res[i];
	}
	res.erase(res.begin());
	for (int i = 0; i < (int)res.size(); i++)
		if ((i & 1) == (res[i] & 1))
			res[i]++;
	return res;
}
Back to top page