#include <bits/stdc++.h>
//#define TAMREF 1
using namespace std;
typedef long long ll;
const char g = 'a' + 26;
const ll o[2] = {613LL, 409LL};
const ll h = 1e9 + 613;
const int mx = 6e5 + 5;
char S[mx], P[mx];
int n, m;
void input(){
scanf("%s",P); m = strlen(P);
for(int i = 0; i < m; i++){
S[2*i] = g;
S[2*i+1] = P[i];
}
S[2*m] = g;
n = 2 * m + 1;
}
int R[mx];
void Manacher(){
int r = 0, j = 0;
for(int i = 1; i < n; i++){
int &h = R[i];
if(i <= r) h = min(r - i, R[2*j - i]);
while(i-h-1 >= 0 && i+h+1 < n && S[i-h-1] == S[i+h+1]) ++h;
if(i + h > r){
j = i;
r = i + h;
}
}
}
ll ph[2][mx], hs[2][mx];
void init_hash(){
for(int i = 0; i < n; i++) S[i] -= 'a'-1;
for(int b = 0; b < 2; b++){
ph[b][0] = 1;
hs[b][0] = S[0];
for(int i = 1; i < n; i++){
ph[b][i] = ph[b][i-1] * o[b] % h;
hs[b][i] = (hs[b][i-1] * o[b] + S[i]) % h;
}
}
}
inline ll enc(int s, int e){
ll H[2];
for(int b = 0; b < 2; b++){
H[b] = ((hs[b][e] - hs[b][s-1] * ph[b][e-s+1]) % h + h) % h;
}
return H[0] * h + H[1];
}
unordered_map<ll,int> I;
vector<int> cnt(1);
vector<int> len(1);
vector<vector<int>> gph(1);
vector<int> isRoot(1);
void Shrink(){
for(int i = 1, s, e; i < n-1; i++){
if(!R[i]) continue;
s = i - R[i] + 1, e = i + R[i] - 1;
ll tmp;
int child_i = -1;
int tmp_i;
int flag_once = 1, keep_loop = 1;
while(e >= s){
tmp = enc(s,e);
tmp_i = I[tmp];
if(!tmp_i){ //insert new hash value
#ifdef TAMREF
printf("%d-th HASH : [%d, %d],\nhash string = ",cnt.size(),s,e);
for(int j = s; j <= e; j++) printf("%c",S[j] + 'a' - 1);
puts("");
#endif // TAMREF
tmp_i = I[tmp] = cnt.size();
cnt.push_back(flag_once);
len.push_back((e-s)/2 + 1);
gph.push_back(vector<int>());
isRoot.push_back(1);
}else{
#ifdef TAMREF
printf("[%d, %d] is already found\n",s,e);
#endif // TAMREF
cnt[tmp_i] += flag_once;
keep_loop = 0;
}
flag_once = 0;
if(child_i != -1){
gph[tmp_i].push_back(child_i);
isRoot[child_i] = 0;
}
if(!keep_loop || e - 2 < s + 2) break;
child_i = tmp_i;
e -= 2;
s += 2;
}
}
}
int vis[mx];
ll ans = 1;
int dfs(int x){
#ifdef TAMREF
printf("dfs : %d\n",x);
#endif // TAMREF
ll c = cnt[x];
vis[x] = 1;
for(int &u : gph[x]){
if(!vis[u]) c += dfs(u);
}
ans = max(ans, c * len[x]);
return c;
}
void pro(){
int N = cnt.size();
for(int i = 1; i < N; i++){
#ifdef TAMREF
printf("%d - th node : cnt = %d, len = %d, isRoot = %d, |gph| = %d\n",i,cnt[i],len[i],isRoot[i],gph[i].size());
#endif // TAMREF
if(isRoot[i] && !vis[i]){
#ifdef TAMREF
printf("dfs start on %d\n",i);
#endif // TAMREF
dfs(i);
}
}
printf("%lld\n",ans);
}
int main(){
input();
Manacher();
init_hash();
Shrink();
pro();
}
Compilation message
palindrome.cpp: In function 'void input()':
palindrome.cpp:16:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%s",P); m = strlen(P);
~~~~~^~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
2 ms |
376 KB |
Output is correct |
3 |
Correct |
2 ms |
560 KB |
Output is correct |
4 |
Correct |
2 ms |
560 KB |
Output is correct |
5 |
Correct |
2 ms |
560 KB |
Output is correct |
6 |
Correct |
2 ms |
560 KB |
Output is correct |
7 |
Correct |
2 ms |
560 KB |
Output is correct |
8 |
Correct |
2 ms |
560 KB |
Output is correct |
9 |
Correct |
2 ms |
560 KB |
Output is correct |
10 |
Correct |
2 ms |
596 KB |
Output is correct |
11 |
Correct |
2 ms |
596 KB |
Output is correct |
12 |
Correct |
2 ms |
616 KB |
Output is correct |
13 |
Correct |
2 ms |
620 KB |
Output is correct |
14 |
Correct |
2 ms |
620 KB |
Output is correct |
15 |
Correct |
2 ms |
620 KB |
Output is correct |
16 |
Correct |
2 ms |
656 KB |
Output is correct |
17 |
Correct |
2 ms |
656 KB |
Output is correct |
18 |
Correct |
2 ms |
656 KB |
Output is correct |
19 |
Correct |
2 ms |
656 KB |
Output is correct |
20 |
Correct |
2 ms |
656 KB |
Output is correct |
21 |
Correct |
2 ms |
656 KB |
Output is correct |
22 |
Correct |
2 ms |
656 KB |
Output is correct |
23 |
Correct |
2 ms |
656 KB |
Output is correct |
24 |
Correct |
2 ms |
656 KB |
Output is correct |
25 |
Correct |
2 ms |
656 KB |
Output is correct |
26 |
Correct |
2 ms |
656 KB |
Output is correct |
27 |
Correct |
2 ms |
656 KB |
Output is correct |
28 |
Correct |
2 ms |
656 KB |
Output is correct |
29 |
Correct |
2 ms |
656 KB |
Output is correct |
30 |
Correct |
2 ms |
656 KB |
Output is correct |
31 |
Correct |
2 ms |
656 KB |
Output is correct |
32 |
Correct |
2 ms |
656 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
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 |
3 ms |
764 KB |
Output is correct |
8 |
Correct |
2 ms |
764 KB |
Output is correct |
9 |
Correct |
2 ms |
764 KB |
Output is correct |
10 |
Correct |
2 ms |
764 KB |
Output is correct |
11 |
Correct |
2 ms |
764 KB |
Output is correct |
12 |
Correct |
2 ms |
764 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
7 ms |
2744 KB |
Output is correct |
2 |
Correct |
8 ms |
2752 KB |
Output is correct |
3 |
Correct |
9 ms |
2916 KB |
Output is correct |
4 |
Correct |
8 ms |
2916 KB |
Output is correct |
5 |
Correct |
7 ms |
2916 KB |
Output is correct |
6 |
Correct |
7 ms |
2916 KB |
Output is correct |
7 |
Correct |
8 ms |
2916 KB |
Output is correct |
8 |
Correct |
3 ms |
2916 KB |
Output is correct |
9 |
Correct |
3 ms |
2916 KB |
Output is correct |
10 |
Correct |
6 ms |
2916 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
80 ms |
21652 KB |
Output is correct |
2 |
Correct |
72 ms |
21652 KB |
Output is correct |
3 |
Correct |
91 ms |
21948 KB |
Output is correct |
4 |
Correct |
76 ms |
21948 KB |
Output is correct |
5 |
Correct |
71 ms |
21948 KB |
Output is correct |
6 |
Correct |
51 ms |
21948 KB |
Output is correct |
7 |
Correct |
71 ms |
21948 KB |
Output is correct |
8 |
Correct |
16 ms |
21948 KB |
Output is correct |
9 |
Correct |
29 ms |
21948 KB |
Output is correct |
10 |
Correct |
64 ms |
21948 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
314 ms |
65700 KB |
Output is correct |
2 |
Correct |
300 ms |
65700 KB |
Output is correct |
3 |
Correct |
360 ms |
66236 KB |
Output is correct |
4 |
Correct |
315 ms |
66236 KB |
Output is correct |
5 |
Correct |
264 ms |
66236 KB |
Output is correct |
6 |
Correct |
267 ms |
66236 KB |
Output is correct |
7 |
Correct |
251 ms |
66236 KB |
Output is correct |
8 |
Correct |
46 ms |
66236 KB |
Output is correct |
9 |
Correct |
44 ms |
66236 KB |
Output is correct |
10 |
Correct |
241 ms |
66236 KB |
Output is correct |
11 |
Correct |
317 ms |
68732 KB |
Output is correct |
12 |
Correct |
60 ms |
68732 KB |
Output is correct |