This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |