Submission #367135

#TimeUsernameProblemLanguageResultExecution timeMemory
367135alireza_kavianiPalindromes (APIO14_palindrome)C++11
100 / 100
85 ms65524 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;

#define all(x)						(x).begin(),(x).end()
#define X							first
#define Y							second
#define sep							' '
#define endl						'\n'
#define SZ(x)						ll(x.size())

const ll MAXN = 3e5 + 10;
const ll LOG = 26;
const ll INF = 8e18;
const ll MOD = 1e9 + 7; //998244353; //1e9 + 9;

int n , palPrv , nxt[MAXN][LOG] , par[MAXN] , len[MAXN] , val[MAXN];
ll ans = 0;
vector<int> adj[MAXN];
string s;

void DFS(int v){
	for(int u : adj[v]){
//		cout << v << sep << u << endl;
		DFS(u);
		val[v] += val[u];
	}
	ans = max(ans , 1ll * val[v] * len[v]);
}

int main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

	cin >> s; n = SZ(s);
	len[0] = -1; len[1] = 0;
	par[1] = 0; palPrv = 1;
	adj[0].push_back(1);
	for(int i = 0 ; i < n ; i++){
		int prv = palPrv , ch = s[i] - 97;
//		cout << i << sep << prv << endl;
		while(1){
			int k = len[prv];
//			cout << i << sep << prv << sep << k << endl;
			if(0 <= i - k - 1 && s[i] == s[i - k - 1])	break;
			prv = par[prv];
		}
//		cout << i << sep << prv << endl;
		if(nxt[prv][ch] != 0){
			palPrv = nxt[prv][ch];
			val[palPrv]++;
			continue;
		}
		int cur = i + 2;
		//cout << prv << sep << cur << endl;
		palPrv = cur; val[cur]++;
		nxt[prv][ch] = cur;
		len[cur] = len[prv] + 2;
		if(len[cur] == 1){
			par[cur] = 1;
			adj[1].push_back(cur);
			continue;
		}
		while(1){
			prv = par[prv];
			int k = len[prv];
			if(0 <= i - k - 1 && s[i] == s[i - k - 1])	break;
		}
		par[cur] = nxt[prv][ch];
		adj[nxt[prv][ch]].push_back(cur);
	}
	DFS(0);
	cout << ans << endl;

    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...