Submission #1166525

#TimeUsernameProblemLanguageResultExecution timeMemory
1166525GurbanPalindromes (APIO14_palindrome)C++20
100 / 100
66 ms71116 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int maxn=3e5+5;

string s;

struct Node {
	int nxt[26];
	int len;
	int sufflink;
	int cnt;
	vector<int>edges;
};

Node tree[maxn];
int suff;
int sz;

void addLetter(int pos){

	int let = s[pos] - 'a';
	
	int curr = suff;
	while(1){
		if(pos - tree[curr].len - 1 >= 0 and s[pos - tree[curr].len - 1] == s[pos]) break;
		curr = tree[curr].sufflink;
	}

	if(tree[curr].nxt[let]){
		suff = tree[curr].nxt[let];
		tree[suff].cnt++;
		return;
	}

	suff = ++sz;
	tree[curr].nxt[let] = suff;
	tree[suff].len = tree[curr].len + 2;
	tree[suff].cnt = 1;

	if(tree[suff].len == 1){
		tree[suff].sufflink = 2;
		tree[2].edges.push_back(suff);
		return;
	}

	while(1){
		curr = tree[curr].sufflink;
		if(pos - tree[curr].len - 1 >= 0 and s[pos - tree[curr].len - 1] == s[pos]){
			tree[suff].sufflink = tree[curr].nxt[let];
			tree[tree[suff].sufflink].edges.push_back(suff);
			break;
		}
	}
}

void init(){
	sz = 2;
	suff = 2;
	tree[1].len = -1;
	tree[1].sufflink = 1;

	tree[2].len = 0;
	tree[2].sufflink = 1;
	
	tree[1].edges.push_back(2);
}

ll ans;

void dfs(int nd){

	for(auto i : tree[nd].edges){
		dfs(i);
		tree[nd].cnt += tree[i].cnt;
	}
	ans = max(ans, 1ll * tree[nd].cnt * tree[nd].len);
}

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

	cin >> s;
	int len = (int)s.size();

	init();

	for(int i = 0;i < len;i++){
		addLetter(i);
	}

	dfs(1);
	cout<<ans;
}
#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...