#include <bits/stdc++.h>
#define lsb(x) (x & (-x))
#define ll long long
#define ull unsigned long long
// 217
// 44
using namespace std;
const int MAXN = (int) 3e5;
const int B = 57;
char str[MAXN + 1];
ull pw[MAXN + 1], hsh[MAXN + 1];
inline ull get_hsh(int l, int r) {
return hsh[r] - hsh[l - 1] * pw[r - l + 1];
}
int len[2 * MAXN + 5];
inline void manacher(int n) {
vector <char> aux(2 * n + 5);
int i, sz = 0;
for(i = 1; i <= n; i++) {
aux[++sz] = '*';
aux[++sz] = str[i];
}
aux[++sz] = '*';
int p = 0;
for(i = 1; i <= sz; i++) {
if(p + len[p] >= i) {
len[i] = min(len[2 * p - i], p + len[p] - i);
}
while(i - len[i] > 0 && i + len[i] <= sz && aux[i - len[i]] == aux[i + len[i]]) {
len[i]++;
}
if(i + len[i] > p + len[p]) {
p = i;
}
}
}
unordered_map <ull, int> mp;
struct Trie {
vector <int> sons;
ll lvl, sz;
};
vector <Trie> v;
ll ans = 0;
int cnt = 0;
void dfs(int nod, int lvl) {
for(auto it : v[nod].sons) {
dfs(it, lvl + 1);
v[nod].sz += v[it].sz;
}
if(2 * lvl < v[nod].lvl) {
while(1) {
}
}
cnt++;
ans = max(ans, 1LL * v[nod].lvl * v[nod].sz);
}
int main() {
//ifstream cin("B.in");
//ofstream cout("B.out");
int i;
ios::sync_with_stdio(false);
//srand(time(NULL));
cin >> str + 1;
int n = strlen(str + 1);
manacher(n);
pw[0] = 1;
for(i = 1; i <= n; i++) {
pw[i] = pw[i - 1] * B;
hsh[i] = hsh[i - 1] * B + str[i] - 'a' + 1;
}
int id = 1;
v.resize(2);
for(i = 2; i <= 2 * n; i++) {
int last = 0, j = 0;
bool ok = 0;
for(j = len[i] / 2; j >= 1; j--) {
ull cur = get_hsh(i / 2 - j + 1, i / 2 + j - (1 - i % 2));
int l = 2 * j - (1 - i % 2);
ok = 0;
if(mp[cur] == 0) {
ok = 1;
mp[cur] = ++id;
Trie aux;
aux.lvl = l;
aux.sz = 0;
v.push_back(aux);
}
if(last != 0) {
v[mp[cur]].sons.push_back(last);
}
else {
v[mp[cur]].sz++;
}
last = mp[cur];
if(!ok) {
break;
}
}
if(ok == 1) {
v[1].sons.push_back(last);
}
}
dfs(1, 0);
if(cnt - 1 != mp.size()) {
while(1) {
}
}
cout << ans;
/*for(i = 0; i < 40000; i++) {
cout << (char) ('a' + rand() % 4);
}*/
//cin.close();
//cout.close();
return 0;
}
Compilation message
palindrome.cpp: In function 'int main()':
palindrome.cpp:76:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
cin >> str + 1;
~~~~^~~
palindrome.cpp:117:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(cnt - 1 != mp.size()) {
~~~~~~~~^~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
2 ms |
380 KB |
Output is correct |
3 |
Correct |
2 ms |
440 KB |
Output is correct |
4 |
Correct |
2 ms |
644 KB |
Output is correct |
5 |
Correct |
2 ms |
644 KB |
Output is correct |
6 |
Correct |
2 ms |
644 KB |
Output is correct |
7 |
Correct |
2 ms |
644 KB |
Output is correct |
8 |
Correct |
2 ms |
644 KB |
Output is correct |
9 |
Correct |
2 ms |
644 KB |
Output is correct |
10 |
Correct |
2 ms |
676 KB |
Output is correct |
11 |
Correct |
2 ms |
676 KB |
Output is correct |
12 |
Correct |
2 ms |
676 KB |
Output is correct |
13 |
Correct |
2 ms |
676 KB |
Output is correct |
14 |
Correct |
2 ms |
676 KB |
Output is correct |
15 |
Correct |
2 ms |
720 KB |
Output is correct |
16 |
Correct |
2 ms |
720 KB |
Output is correct |
17 |
Correct |
2 ms |
720 KB |
Output is correct |
18 |
Correct |
2 ms |
720 KB |
Output is correct |
19 |
Correct |
2 ms |
720 KB |
Output is correct |
20 |
Correct |
2 ms |
720 KB |
Output is correct |
21 |
Correct |
2 ms |
748 KB |
Output is correct |
22 |
Correct |
2 ms |
748 KB |
Output is correct |
23 |
Correct |
2 ms |
748 KB |
Output is correct |
24 |
Correct |
2 ms |
748 KB |
Output is correct |
25 |
Correct |
2 ms |
748 KB |
Output is correct |
26 |
Correct |
2 ms |
748 KB |
Output is correct |
27 |
Correct |
2 ms |
748 KB |
Output is correct |
28 |
Correct |
3 ms |
748 KB |
Output is correct |
29 |
Correct |
2 ms |
748 KB |
Output is correct |
30 |
Correct |
2 ms |
748 KB |
Output is correct |
31 |
Correct |
2 ms |
748 KB |
Output is correct |
32 |
Correct |
2 ms |
748 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
764 KB |
Output is correct |
2 |
Correct |
2 ms |
764 KB |
Output is correct |
3 |
Correct |
2 ms |
764 KB |
Output is correct |
4 |
Correct |
2 ms |
764 KB |
Output is correct |
5 |
Correct |
2 ms |
764 KB |
Output is correct |
6 |
Correct |
2 ms |
764 KB |
Output is correct |
7 |
Correct |
2 ms |
816 KB |
Output is correct |
8 |
Correct |
2 ms |
828 KB |
Output is correct |
9 |
Correct |
2 ms |
828 KB |
Output is correct |
10 |
Correct |
2 ms |
828 KB |
Output is correct |
11 |
Correct |
2 ms |
828 KB |
Output is correct |
12 |
Correct |
2 ms |
828 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
2320 KB |
Output is correct |
2 |
Correct |
9 ms |
2320 KB |
Output is correct |
3 |
Correct |
9 ms |
2320 KB |
Output is correct |
4 |
Correct |
8 ms |
2320 KB |
Output is correct |
5 |
Correct |
8 ms |
2320 KB |
Output is correct |
6 |
Correct |
7 ms |
2320 KB |
Output is correct |
7 |
Correct |
7 ms |
2320 KB |
Output is correct |
8 |
Correct |
4 ms |
2320 KB |
Output is correct |
9 |
Correct |
4 ms |
2320 KB |
Output is correct |
10 |
Incorrect |
4 ms |
2320 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
72 ms |
17236 KB |
Output is correct |
2 |
Correct |
70 ms |
17236 KB |
Output is correct |
3 |
Correct |
79 ms |
17260 KB |
Output is correct |
4 |
Correct |
75 ms |
17260 KB |
Output is correct |
5 |
Correct |
66 ms |
17260 KB |
Output is correct |
6 |
Correct |
51 ms |
17260 KB |
Output is correct |
7 |
Correct |
59 ms |
17260 KB |
Output is correct |
8 |
Correct |
15 ms |
17260 KB |
Output is correct |
9 |
Correct |
26 ms |
17260 KB |
Output is correct |
10 |
Incorrect |
32 ms |
17260 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
361 ms |
51324 KB |
Output is correct |
2 |
Correct |
350 ms |
51324 KB |
Output is correct |
3 |
Correct |
394 ms |
51372 KB |
Output is correct |
4 |
Correct |
336 ms |
51372 KB |
Output is correct |
5 |
Correct |
293 ms |
51372 KB |
Output is correct |
6 |
Correct |
263 ms |
51372 KB |
Output is correct |
7 |
Correct |
252 ms |
51372 KB |
Output is correct |
8 |
Correct |
46 ms |
51372 KB |
Output is correct |
9 |
Correct |
43 ms |
51372 KB |
Output is correct |
10 |
Incorrect |
136 ms |
51372 KB |
Output isn't correct |
11 |
Halted |
0 ms |
0 KB |
- |