結果
問題 | No.765 ukuku 2 |
ユーザー |
|
提出日時 | 2018-12-25 09:40:47 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 245 ms / 3,000 ms |
コード長 | 2,651 bytes |
コンパイル時間 | 1,833 ms |
コンパイル使用メモリ | 174,104 KB |
実行使用メモリ | 16,256 KB |
最終ジャッジ日時 | 2024-10-01 13:15:09 |
合計ジャッジ時間 | 7,700 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 48 |
ソースコード
#define _USE_MATH_DEFINES#include "bits/stdc++.h"using namespace std;#define FOR(i,j,k) for(int (i)=(j);(i)<(int)(k);++(i))#define rep(i,j) FOR(i,0,j)#define each(x,y) for(auto &(x):(y))#define mp make_pair#define MT make_tuple#define all(x) (x).begin(),(x).end()#define debug(x) cout<<#x<<": "<<(x)<<endl#define smax(x,y) (x)=max((x),(y))#define smin(x,y) (x)=min((x),(y))#define MEM(x,y) memset((x),(y),sizeof (x))#define sz(x) (int)(x).size()#define RT returnusing ll = long long;using pii = pair<int, int>;using vi = vector<int>;using vll = vector<ll>;struct RollingHash {static const int C = 31, C2 = 29, P = 1000000007, P2 = 1000000009;int _n;vector<long long> pw, pw2, hs, hs2;RollingHash() {}RollingHash(const string &st):_n((int)st.size()), pw(_n + 1), pw2(_n + 1), hs(_n + 1), hs2(_n + 1){pw[0] = pw2[0] = 1;rep(i, _n) {pw[i + 1] = (pw[i] * C) % P;pw2[i + 1] = (pw2[i] * C2) % P2;hs[i + 1] = (C*hs[i] + st[i]) % P;hs2[i + 1] = (C2*hs2[i] + st[i]) % P2;}}// [l, r)pii getHash(int l, int r) {int res, res2;res = (hs[r] - hs[l] * pw[r - l]) % P;res2 = (hs2[r] - hs2[l] * pw2[r - l]) % P2;if (res < 0)res += P;if (res2 < 0)res2 += P2;return mp(res, res2);}};string S;int N;void solve() {cin >> S;N = sz(S);auto T = S;reverse(all(T));RollingHash hsh(S), rev(T);auto f = [&](int ml, int mr, int x) {auto p = hsh.getHash(ml - x, ml);auto q = rev.getHash(N - (mr + x), N - mr);return p == q;};int ans = 0;rep(ml, N) FOR(mr, ml, ml + 2) {int ok = 0, ng = min(ml, N - mr) + 1;while (ng - ok > 1) {int x = (ok + ng) / 2;(f(ml, mr, x) ? ok : ng) = x;}int l = ml - ok, r = mr + ok;if (r - l == N)continue;smax(ans, r - l);if (l > 1) {ok = 0, ng = min(l - 1, N - r) + 1;while (ng - ok > 1) {int x = (ok + ng) / 2;(f(l - 1, r, x) ? ok : ng) = x;}smax(ans, r - l + ok * 2);}if (r < N) {ok = 0, ng = min(l, N - (r + 1)) + 1;while (ng - ok > 1) {int x = (ok + ng) / 2;(f(l, r + 1, x) ? ok : ng) = x;}smax(ans, r - l + ok * 2);}}cout << ans << endl;}int main() {ios::sync_with_stdio(false);cin.tie(0);cout << fixed << setprecision(15);solve();return 0;}