Submission #399088

#TimeUsernameProblemLanguageResultExecution timeMemory
399088BERNARB01Palindromes (APIO14_palindrome)C++17
23 / 100
1089 ms2472 KiB
#include <bits/stdc++.h>

using namespace std;

vector<int> Z(const string& s) {
    int n = s.size();
    vector<int> z(n);
    int x = 0, y = 0;
    for (int i = 1; i < n; i++) {
        z[i] = max(0, min(z[i-x], y-i+1));
        while (i+z[i] < n && s[z[i]] == s[i+z[i]]) {
            x = i; y = i+z[i]; z[i]++;
        }
    }
    return z;
}

bool pal(const string& s) {
	string t = s;
	reverse(t.begin(), t.end());
	return s == t;
}

vector<int> Pals(const string& s) {
	vector<int> ret(s.length(), 0);
	for (int i = 0; i < (int) s.length(); i++) {
		ret[i] = pal(s.substr(0, i + 1));
	}
	return ret;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	//freopen("palindrome.in", "r", stdin);
	//freopen("palindrome.out", "w", stdout);
	string s;
	cin >> s;
	int n = s.length();
	long long res = 0;
	for (int i = 0; i < n; i++) {
		string t = s.substr(i, n - i);
		vector<int> pal = Pals(t);
		t += '#';
		t += s;
		vector<int> z = Z(t);
		vector<long long> cnt(n + 1);
		for (int j = n - i; j < (int) z.size(); j++) {
			cnt[z[j]]++;
		}
		for (int j = n - 1; j >= 0; j--) {
			cnt[j] += cnt[j + 1];
		}
		for (int j = i; j < n; j++) {
			long long len = j - i + 1;
			if (!pal[j - i]) {
				continue;
			}
			long long ans = cnt[len];
			ans *= len;
			res = max(res, ans);
		}
	}
	cout << res << '\n';
	return 0;
}
#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...