Submission #1300081

#TimeUsernameProblemLanguageResultExecution timeMemory
1300081DaciejMaciejPalindromes (APIO14_palindrome)C++20
100 / 100
49 ms63000 KiB
#include <bits/stdc++.h> // #include <ext/pb_ds/assoc_container.hpp> // #include <ext/pb_ds/tree_policy.hpp> // #include <ext/rope> using namespace std; // using namespace __gnu_pbds; typedef long long ll; typedef unsigned long long ull; typedef unsigned int uint; typedef long double ld; template <class T> using VV = vector<vector<T>>; using VI = vector<int>; using VVI = vector<vector<int>>; using VL = vector<long long>; using VVL = vector<vector<long long>>; using VC = vector<char>; using VVC = vector<vector<char>>; using VB = vector<bool>; using VVB = vector<vector<bool>>; using VD = vector<double>; using VVD = vector<vector<double>>; using PII = pair<int, int>; using PLL = pair<long long, long long>; using PIL = pair<int, long long>; using PLI = pair<long long, int>; using VPII = vector<pair<int, int>>; using VPLL = vector<pair<long long, long long>>; #define LINE '\n' #define SPACE ' ' #define PB push_back #define FOR(i, a, b) for (int i = (a); i < (int(b)); i++) #define FORE(i, a, b) for (int i = (a); i <= (int)((b)); i++) #define ALL(x) x.begin(), x.end() #define RALL(x) x.rbegin(), x.rend() #define sq(a) ((a) * (a)) #define sz(x) ((int)x.size()) #define fastio() \ ios_base::sync_with_stdio(false); \ cin.tie(nullptr); \ cout.tie(nullptr) #define debug(x) cerr << #x << " = " << x << endl; const ll MOD = 51123987; template <class T> inline void maxi(T &a, T b) { a = max(a, b); } template <class T> inline void mini(T &a, T b) { a = min(a, b); } template <class T> inline void addi(T &a, T b) { a = (a + b) % MOD; } template <class T> inline void subi(T &a, T b) { a = (a - b + MOD) % MOD; } template <class T> inline T add(T a, T b) { return (a + b) % MOD; } template <class T> inline T sub(T a, T b) { return (a - b + MOD) % MOD; } template <class T> inline T mul(T a, T b) { return ((a % MOD) * (b % MOD)) % MOD; } constexpr ll binpow(ll a, ll b, ll mod) { ll res = 1; while (b > 0) { if (b & 1) { res = (res * a) % mod; } a = (a * a) % mod; b >>= 1; } return res; } const int INF = 1e9; const int MAX_N = 1e5 + 3; VI z_function(string s) { int n = sz(s); VI z(n); int L = 0, R = 0; FOR(i, 1, n) { if (i <= R) z[i] = min(R - i + 1, z[i - L]); while (i + z[i] < n && s[z[i]] == s[i + z[i]]) z[i]++; if (i + z[i] - 1 > R) { L = i; R = i + z[i] - 1; } } return z; } VI manacher_d1(string s) { int n = sz(s); VI d1(n); int l = 0, r = 0; FOR(i, 0, n) { int k = 1; if (i <= r) { int j = l + r - i; k = min(d1[j], r - i + 1); } while (i - k >= 0 && i + k < n && s[i - k] == s[i + k]) k++; d1[i] = k; if (i + k - 1 > r) { l = i - k + 1; r = i + k - 1; } } return d1; } VI manacher_d2(string s) { int n = sz(s); VI d2(n); int l = 0, r = -1; FOR(i, 0, n) { int k = 0; if (i <= r) { int j = l + r - i + 1; k = min(d2[j], r - i + 1); } while (i - k - 1 >= 0 && i + k < n && s[i - k - 1] == s[i + k]) k++; d2[i] = k; if (i + k - 1 > r) { l = i - k; r = i + k - 1; } } return d2; } struct PTree { struct Node { int len; int link; array<int, 26> next; ll cnt; Node(int _len = 0, int _link = 0) : len(_len), link(_link), cnt(0) { next.fill(-1); } }; string s; vector<Node> tree; int last; void init() { s.clear(); tree.clear(); tree.push_back(Node{-1, 0}); tree.push_back(Node{0, 0}); tree[0].link = -1; tree[1].link = 0; last = 1; } void extend(char c) { int pos = sz(s); s.push_back(c); int cur = last; while (true) { int len = tree[cur].len; if (pos - 1 - len >= 0 && s[pos - 1 - len] == c) break; cur = tree[cur].link; } if (tree[cur].next[c - 'a'] != -1) { last = tree[cur].next[c - 'a']; tree[last].cnt++; return; } int id = (int)tree.size(); tree[cur].next[c - 'a'] = id; tree.push_back(Node{tree[cur].len + 2, 0}); last = id; tree[last].cnt = 1; if (tree[last].len == 1) { tree[last].link = 1; return; } cur = tree[cur].link; while (true) { int len = tree[cur].len; if (pos - 1 - len >= 0 && s[pos - 1 - len] == c) { tree[last].link = tree[cur].next[c - 'a']; break; } cur = tree[cur].link; } } void build(string &inp) { init(); FOR(i, 0, sz(inp)) { char c = inp[i]; extend(c); } for (int i = sz(tree) - 1; i >= 2; i--) { int par = tree[i].link; tree[par].cnt += tree[i].cnt; } } }; void solve() { string s; cin >> s; PTree ptree; ptree.build(s); ll ans = 0; FOR(i, 2, sz(ptree.tree)) { // debug(ptree.tree[i].cnt); // debug(ptree.tree[i].len); maxi(ans, ptree.tree[i].cnt * ptree.tree[i].len); } cout << ans << LINE; } int main() { fastio(); int t = 1; // cin >> t; while (t--) solve(); }
#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...