# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1166056 | Sang | Palindromes (APIO14_palindrome) | C++20 | 89 ms | 103848 KiB |
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
#define FORD(i, a, b) for (int i = (a), _b = (b); i >= _b; i--)
#define fi first
#define se second
#define pb push_back
#define ALL(a) (a).begin(), (a).end()
#define task "kbsiudthw"
typedef vector<int> vi;
typedef pair<int, int> ii;
typedef pair<int, ii> pii;
const int N = 3e5 + 5;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 2277;
struct Node{
int nxt[26], len, sufflink, cnt;
vector<int> edges;
};
int len, num, suff;
string s;
Node tree[N];
bool addLetter(int pos){
int cur = suff, curlen = 0;
int let = s[pos] - 'a';
while (1){
curlen = tree[cur].len;
if (pos - 1 - curlen >= 1 && s[pos-1-curlen] == s[pos]) break;
cur = tree[cur].sufflink;
}
if (tree[cur].nxt[let]){
suff = tree[cur].nxt[let];
tree[tree[cur].nxt[let]].cnt++;
return false;
}
++num;
suff = num;
tree[num].len = tree[cur].len + 2;
tree[cur].nxt[let] = num;
tree[num].cnt = 1;
if (tree[num].len == 1){
tree[num].sufflink = 2;
tree[2].edges.pb(num);
return true;
}
while (true){
cur = tree[cur].sufflink;
curlen = tree[cur].len;
if (pos - 1 - curlen >= 1 && s[pos-1-curlen] == s[pos]) {
tree[num].sufflink = tree[cur].nxt[let];
tree[tree[cur].nxt[let]].edges.pb(num);
break;
}
}
return 1;
}
void initTree(){
num = 2; suff = 2;
tree[1].len = -1; tree[1].sufflink = 1;
tree[2].len = 0; tree[2].sufflink = 1;
tree[1].edges.pb(2);
}
int dfs(int u){
int ans = 0;
for (int &v : tree[u].edges){
ans = max(ans, dfs(v));
tree[u].cnt += tree[v].cnt;
}
ans = max(ans, tree[u].len * tree[u].cnt);
return ans;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(task".inp", "r")){
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
cin >> s;
len = s.size(); s = ' ' + s;
initTree();
FOR (i, 1, len) {
addLetter(i);
}
cout << dfs(1);
return 0;
}
Compilation message (stderr)
# | 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... |