제출 #738469

#제출 시각아이디문제언어결과실행 시간메모리
738469Abrar_Al_SamitPalindromes (APIO14_palindrome)C++17
23 / 100
1085 ms2652 KiB
#include<bits/stdc++.h>
using namespace std;

const int mod = 1e9 + 9;
const int b = 31;
const int nax = 10003;

unordered_map<long long,int>cnt[nax];
string s;
long long p[nax];
int n;
long long pwr[nax];
long long ans = 0;

void PlayGround() {
	cin>>s;
	n = s.size();

	long long pw = 1;
	for(int i=0; i<n; ++i) {
		pwr[i] = pw;
		p[i] = (pw * (s[i]-'a'+1));
		if(i) p[i] += p[i-1];

		p[i] %= mod;
		pw = (pw * b) % mod;
	}


	for(int i=0; i<n; ++i) {
		bool ok1 = 1, ok2 = 1;
		for(int j=0, len=1;  ; ++j, len+=2) {
			if(i-j<0 || i+j>=n) break;
			if(s[i-j]!=s[i+j]) {
				ok1 = 0;
			}
			if(i+j+1>=n) ok2 = 0;
			if(ok2 && s[i-j]!=s[i+j+1]) {
				ok2 = 0;
			}

			if(!ok1 && !ok2) break;

			if(ok1) {
				long long h_val = p[i+j];
				if(i-j) h_val -= p[i-j-1];
				h_val *= pwr[n-1-(i+j)];
				h_val %= mod;
				if(h_val<0) h_val += mod;

				long long app = ++cnt[len][h_val];
				ans = max(ans, len * app);
			}
			if(ok2) {
				long long h_val = p[i+j+1];
				if(i-j) h_val -= p[i-j-1];
				h_val *= pwr[n-1-(i+j+1)];
				h_val %= mod;
				if(h_val<0) h_val += mod;

				long long app = ++cnt[len+1][h_val];
				ans = max(ans, (1+len) * app);
			}
		}
	}
	cout<<ans<<'\n';

	cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	PlayGround();
	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...