제출 #716932

#제출 시각아이디문제언어결과실행 시간메모리
716932pragmatistPalindromes (APIO14_palindrome)C++17
47 / 100
1070 ms65664 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #define ll long long #define pb push_back #define all(v) v.begin(),v.end() #define rall(v) v.rbegin(),v.rend() #define sz(v) (int)v.size() #define x first #define y second #define nl "\n" using namespace std; using namespace __gnu_pbds; const int N = (int)3e5 + 7; const int M = (int)2e6 + 5e5 + 7; const ll MOD = (ll)998244353; const int inf = (int)1e9 + 7; const int B = (int)390; const ll INF = (ll)1e18 + 7; pair<int, int> dir[] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}}; bool bit(int mask, int i) { return (mask >> i & 1); } int sum(int x, int y) { x += y; if(x >= MOD) x -= MOD; return x; } int sub(int x, int y) { x -= y; if(x < 0) x += MOD; return x; } int mult(int x, int y) { return 1ll * x * y % MOD; } string s; int n, p[N], h[N]; int get(int l, int r) { return mult(sub(h[r], h[l - 1]), p[n - r + 1]); } struct custom_hash { static uint64_t splitmix64(uint64_t x) { // http://xorshift.di.unimi.it/splitmix64.c x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } }; void solve() { cin >> s; n = sz(s); s = '#' + s; for(int i = 1; i <= n; ++i) { h[i] = sum(h[i - 1], mult(s[i] - 'a' + 1, p[i])); } gp_hash_table<int, int, custom_hash> cnt[n + 1]; for(int i = 1; i <= n; ++i) { int l = i + 1, r = i - 1; while(s[l - 1] == s[r + 1]) { l--; r++; if(l < 1 || r > n) break; cnt[r - l + 1][get(l, r)]++; } l = i + 1, r = i; while(s[l - 1] == s[r + 1]) { l--; r++; if(l < 1 || r > n) break; cnt[r - l + 1][get(l, r)]++; } } int ans = 0; for(int i = 1; i <= n; ++i) { for(auto [x, y] : cnt[i]) { ans = max(ans, y * i); } } cout << ans << nl; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); //freopen("in.txt", "r", stdin); p[0] = 1; for(int i = 1; i <= 1e5; ++i) { p[i] = mult(p[i - 1], 31); } //freopen("palindrome.in", "r", stdin); //freopen("palindrome.out", "w", stdout); int test = 1; //cin >> test; for(int i = 1; i <= test; ++i) { //cout << "Case " << i << ":\n"; solve(); } return 0; } /* possible causes of error : * array bounds * int overflow * special case (n == 1?) * haven't clean something * wrong N | M | inf | INF | MOD * try to write brute force to find test * don't waste time * don't write bullshit * solution is easy */
#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...