제출 #1162836

#제출 시각아이디문제언어결과실행 시간메모리
1162836blueol회문 (APIO14_palindrome)C++20
47 / 100
9 ms13896 KiB
#include <bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i = a; i < (b); i++) #define sz(a) (int)(a).size() using vi = vector<int>; struct eertree { vi s, rem; struct node { int len = 0, link = 0, from = 0, cnt = 0, freq = 0; int visit = -1; array<int, 26> to{}; }; vector<node> T; int last, n; int head = 1, overall = 0; eertree(): s(1), rem(2, -1), T(2), last(0), n(1) { s.reserve(1e6 + 5), T.reserve(1e6 + 5), rem.reserve(1e6 + 5); s[0] = -1; T[0].link = T[1].link = 1; T[1].len = -1; T[0].cnt = T[1].cnt = 1; } int get_link(int v) { while (s[n - T[v].len - 2] != s[n - 1]) v = T[v].link; return v; } void update(int u, int p) { if (u < 2) return; auto& x = T[u]; if (p > x.visit) x.visit = p; if (!x.cnt && (rem[x.visit] == -1 || T[rem[x.visit]].len < x.len)) rem[x.visit] = u; } void add(char ch) { int c = ch - 'a'; s.push_back(c), rem.push_back(0); n++; last = get_link(last); if (T[last].to[c] == 0) { auto& nd = T.emplace_back(); nd.len = T[last].len + 2; nd.link = T[get_link(T[last].link)].to[c]; nd.from = last; T[last].to[c] = sz(T) - 1; T[nd.from].cnt++, T[nd.link].cnt++; overall++; } last = T[last].to[c]; T[last].freq++; update(last, n - T[last].len); } void pop() { int node = rem[head], c = s[head]; s[head++] = -1; if (node < 2) return; auto& nd = T[node]; if (nd.cnt || nd.visit != head - 1) return; if (n - head + 1 == T[last].len) last = T[last].link; overall--; T[nd.from].to[c] = 0; T[nd.from].cnt--, T[nd.link].cnt--; update(nd.from, head); update(nd.link, head - 1 + nd.len - T[nd.link].len); } void compute() { for (int i = sz(T) - 1; i >= 0; i--) { T[T[i].link].freq += T[i].freq; } } }; int main(){ cin.tie(0)->sync_with_stdio(0); string s; cin >> s; eertree e; for(char c: s)e.add(c); e.compute(); int mx = 0; for(int i = 0; i < (int)e.T.size(); i++)mx = max(mx, e.T[i].freq*e.T[i].len); cout << mx << '\n'; }
#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...