Submission #243595

#TimeUsernameProblemLanguageResultExecution timeMemory
243595islingrPalindromes (APIO14_palindrome)C++14
0 / 100
1091 ms37256 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 5 << 16, A = 26;
int link[N], len[N], nxt[N][A], occ[N], v = 2, l[N], r[N];
string s;

void print(int i) {
	cout << i << ": ";
	for (int j = l[i]; j <= r[i]; ++j)
		cout << s[j];
	cout << '\n';
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> s;

	len[1] = -1; link[1] = 1;
	len[2] = 0; link[2] = 1;

	for (int i = 0; i != int(s.size()); ++i) {
		int cur = v;
		while (s[i - len[cur] - 1] != s[i]) cur = link[cur];

		int &tmp = nxt[cur][s[i] - 'a'];
		if (!tmp) {
			tmp = ++v;
			len[tmp] = len[cur] + 2;
			l[tmp] = i - len[cur] - 1;
			r[tmp] = i;
			if (cur != 1) {
				cur = link[cur];
				while (s[i - len[cur] - 1] != s[i]) cur = link[cur];
				link[tmp] = nxt[cur][s[i] - 'a'];
				// assert(link[tmp]);
			} else link[tmp] = 2;
		}
		++occ[v];
	}

	for (int i = v; i > 2; --i) occ[link[i]] += occ[i];

	long long ans = 0;
	for (int i = 3; i <= v; ++i) ans = max(ans, 1ll * occ[i] * len[i]);
	cout << ans << '\n';

	// for (int i = 1; i <= v; ++i) {
	// 	print(link[i]);
	// 	print(i);
	// 	cout << '\n';
	// 	// cout << link[i] << ' ' << i << '\n';
	// }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...