Submission #493451

#TimeUsernameProblemLanguageResultExecution timeMemory
493451Bogdan1110Palindromes (APIO14_palindrome)C++17
100 / 100
65 ms62316 KiB
#include <bits/stdc++.h>
using namespace std;

string s;

struct PalTree {
	struct Node {
		int cnt;
		int len;
		int dub;
		int slink;
		int to[26];
		Node() { 
			len = dub = cnt = slink = 0; 
			for (int i = 0; i < 26 ; i++ ) to[i] = 0;
		}
		Node( int _len, int _dub, int _cnt, int _slink) {
			len = _len;
			dub = _dub;
			cnt = _cnt;
			slink = _slink;
			for (int i = 0 ; i < 26 ; i++ ) to[i] = 0;
		}
	};
	vector<Node>vec;
	int suff = 2;
	
	void AddNode( int i ) {
		while(i - 1 - vec[suff].len < 0 ||  s[i]!= s[i-vec[suff].len-1] ) {
			suff = vec[suff].slink;
		}
		//cout << i << ' ' << suff << "    ";
		int gde=  s[i]-'a';
		int cvor = vec[suff].to[gde];
		if ( vec[suff].to[gde] == 0 ) {
			vec[suff].to[gde] = vec.size();
			cvor = vec.size();
			vec.push_back(Node(vec[suff].len+2, vec[suff].dub+1, 0, suff));
			if ( suff == 1 ) {
				vec[cvor].slink = 2;
			}
			else {
				suff = vec[suff].slink;
				while(i - 1 - vec[suff].len < 0 ||  s[i- vec[suff].len -1] != s[i] ) {
					suff = vec[suff].slink;
				}
				vec[cvor].slink = vec[suff].to[gde];
			}
			vec[cvor].dub = vec[vec[cvor].slink].dub + 1;
		}
		suff = cvor;
		vec[cvor].cnt++;
		//cout << i <<  ' ' << vec[suff].len <<  ' ' << vec[suff].slink << ' ' << suff << endl;
	} 
	
	void Init() {
		vec.clear();
		suff = 2;
		vec.push_back(Node(0,0,0,0));
		vec.push_back(Node(-1,0,0,1));
		vec.push_back(Node(0,0,0,1));
	}
	
	void CalcCnt() {
		for (int i = vec.size()-1 ; i >= 2  ; i-- ) {
			vec[vec[i].slink].cnt += vec[i].cnt;
		}
	}
	
};
PalTree pt;
int main () {
	cin >> s;
	int n = s.length();
	pt.Init();
	for ( int i = 0 ; i < n ; i++ ) {
		pt.AddNode(i);
	}
	pt.CalcCnt();
	long long rez = 0;
	for (int i = 0 ; i < pt.vec.size(); i++ ) {
		rez = max(rez, (long long)pt.vec[i].len * pt.vec[i].cnt);
		//cout << pt.vec[i].len << ' ' << pt.vec[i].cnt << endl ;
	}
	cout << rez << endl ;
}



















Compilation message (stderr)

palindrome.cpp: In function 'int main()':
palindrome.cpp:81:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<PalTree::Node>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |  for (int i = 0 ; i < pt.vec.size(); i++ ) {
      |                   ~~^~~~~~~~~~~~~~~
#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...