제출 #137288

#제출 시각아이디문제언어결과실행 시간메모리
137288egorlifar회문 (APIO14_palindrome)C++17
100 / 100
169 ms83308 KiB
/* ЗАПУСКАЕМ ░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░ ▄███▀░◐░░░▌░░░░░░░ ░░░░▌░░░░░▐░░░░░░░ ░░░░▐░░░░░▐░░░░░░░ ░░░░▌░░░░░▐▄▄░░░░░ ░░░░▌░░░░▄▀▒▒▀▀▀▀▄ ░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄ ░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄ ░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄ ░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄ ░░░░░░░░░░░▌▌░▌▌░░░░░ ░░░░░░░░░░░▌▌░▌▌░░░░░ ░░░░░░░░░▄▄▌▌▄▌▌░░░░░ */ #include <iostream> #include <complex> #include <vector> #include <string> #include <algorithm> #include <cstdio> #include <numeric> #include <cstring> #include <ctime> #include <cstdlib> #include <set> #include <map> #include <unordered_map> #include <unordered_set> #include <list> #include <cmath> #include <bitset> #include <cassert> #include <queue> #include <stack> #include <deque> #include <random> using namespace std; template<typename T1, typename T2>inline void chkmin(T1 &x, T2 y) { if (x > y) x = y; } template<typename T1, typename T2>inline void chkmax(T1 &x, T2 y) { if (x < y) x = y; } #define sz(c) (int)(c).size() #define all(c) (c).begin(), (c).end() #define rall(c) (c).rbegin(), (c).rend() #define left left224 #define right right224 #define next next224 #define rank rank224 #define prev prev224 #define y1 y1224 #define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin) #define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout) #define files(FILENAME) read(FILENAME), write(FILENAME) #define pb push_back #define mp make_pair const string FILENAME = "input"; using ll = long long; struct node{ node* CH[30]; node* bk; int len, cnt; } *n0, *n1; bool cmp(node* X, node* Y){ return X -> len > Y -> len; } int n; string s; ll mx; vector<node*> v; void precompute() { n1 = new node(); n0 = new node(); n1 -> len = -1, n0 -> len = 0; n0 -> bk = n1; n1 -> bk = n1; node* cur = n0; for(int i = 0;i < n;i++){ for(; cur->len + 1 > i || s[i - cur->len - 1] != s[i]; cur = cur -> bk); node *rmb = cur -> bk; if(cur -> CH[s[i] - 'a'] == NULL) cur -> CH[s[i] - 'a'] = new node(), v.pb(cur -> CH[s[i] - 'a']); cur -> CH[s[i] - 'a'] -> len = cur -> len + 2; cur = cur -> CH[s[i] - 'a']; cur -> cnt++; for(; rmb -> len + 1 > i || s[i - rmb->len - 1] != s[i]; rmb = rmb -> bk); if(cur -> len == 1) cur -> bk = n0; else{ if(rmb -> CH[s[i] - 'a'] == NULL) rmb -> CH[s[i] - 'a'] = new node(), v.pb(rmb -> CH[s[i] - 'a']); cur -> bk = rmb -> CH[s[i] - 'a']; } } } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); //read(FILENAME); cin >> s; n = sz(s); precompute(); sort(all(v), cmp); for (auto &x: v) { chkmax(mx, (ll)x -> len * x -> cnt); x -> bk -> cnt += x -> cnt; } cout << mx << endl; }
#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...