Submission #399778

#TimeUsernameProblemLanguageResultExecution timeMemory
399778BERNARB01Palindromes (APIO14_palindrome)C++17
100 / 100
34 ms41124 KiB
#include <bits/stdc++.h> using namespace std; const int N = 3e5 + 1, A = 26; int L[N], P[N], T[N][A], C[N]; int sP[N], diff[N], SA[N]; int id, cr, II; char s[N]; class eertree { private: int n; int Pr(int v) { while(s[II - L[v] - 2] != s[II - 1]) { v = P[v]; } return v; } void add(char c) { int ch = c - 'a'; s[II++] = ch; cr = Pr(cr); if(!T[cr][ch]) { L[id] = L[cr] + 2; P[id] = T[Pr(P[cr])][ch]; diff[id] = L[id] - L[P[id]]; if(diff[id] == diff[P[id]]) { sP[id] = sP[P[id]]; } else { sP[id] = P[id]; } T[cr][ch] = id++; } cr = T[cr][ch]; C[cr]++; } public: eertree() {}; eertree(const string& _s) { s[II++] = -1; P[0] = 1; L[1] = -1; id = 2; n = _s.length(); for (int i = 0; i < n; i++) { add(_s[i]); } } long long solve() { vector<int> inDeg(n + 2, 0); for (int i = 2; i < n + 2; i++) { inDeg[P[i]]++; } vector<int> que; for (int i = 2; i < n + 2; i++) { if (inDeg[i] == 0) { que.push_back(i); } } for (int b = 0; b < (int) que.size(); b++) { int u = que[b]; int v = P[u]; if (v < 2) { continue; } C[v] += C[u]; inDeg[v]--; if (inDeg[v] == 0) { que.push_back(v); } } long long res = 0; for (int i = 2; i < n + 2; i++) { res = max(res, C[i] * 1LL * L[i]); } return res; } }; int main() { ios::sync_with_stdio(false); cin.tie(0); string t; cin >> t; eertree pals(t); cout << pals.solve() << '\n'; return 0; }
#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...