Submission #641515

#TimeUsernameProblemLanguageResultExecution timeMemory
641515thiago_bastosNecklace (Subtask 4) (BOI19_necklace4)C++17
15 / 15
520 ms412 KiB
#include "bits/stdc++.h"

using namespace std;
 
using i64 = long long;
using u64 = unsigned long long;
using ld = long double;
using ii = pair<int, int>;

vector<int> kmp(string& s) {
	int n = s.size();
	vector<int> p(n);
	p[0] = 0;
	for(int i = 1; i < n; ++i) {
		int j = p[i - 1];
		while(j && s[i] != s[j]) j = p[j - 1];
		p[i] = j;
		if(s[i] == s[j]) ++p[i];
	}
	return p;
}

vector<int> max_prefix(string& s, string& t) {
	string p = s + "#" + t;
	auto k = kmp(p);
	k.erase(k.begin(), k.begin() + s.size() + 1);
	return k;	
}

vector<int> max_suffix(string& s, string& t) {
	string p = string(s.rbegin(), s.rend()) + "$" + string(t.rbegin(), t.rend());
	auto k = kmp(p);
	k.erase(k.begin(), k.begin() + s.size() + 1);
	reverse(k.begin(), k.end());
	return k;
}

tuple<int, int, int> necklace(string& s, string& t) {
	int n = s.size(), m = t.size();
	auto ans = make_tuple(-1, -1, -1);

	for(int i = 0; i < m; ++i) {
		string p;

		for(int j = 0; j < m; ++j) {
			int k = i + j;
			if(k >= m) k -= m;
			p += t[k];
		}

		auto k = max_prefix(p, s);
		auto z = max_suffix(p, s);

		z.push_back(0);

		for(int j = 0; j < n; ++j)
			ans = max(ans, make_tuple(min(k[j], m - i) + min(z[j + 1], i), j - k[j] + 1, i - z[j + 1]));
	} 

	return ans;
}	

void solve() {
	string s, t;

	cin >> s >> t;

	int m = t.size();

	auto ans1 = necklace(s, t);

	reverse(t.begin(), t.end());
	
	auto ans2 = necklace(s, t);

	get<2>(ans2) = m - get<2>(ans2) - get<0>(ans2);

	ans1 = max(ans1, ans2);

	cout << get<0>(ans1) << '\n';
	cout << get<1>(ans1) << ' ' << get<2>(ans1) << '\n';
}

int main() {
	ios_base :: sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
	//cin >> t;
	while(t--) solve();
	return 0;
}
 
#Verdict Execution timeMemoryGrader output
Fetching results...