Codeforces 524F And Yet Another Bracket Sequence 哈希

Posted cjlhy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 524F And Yet Another Bracket Sequence 哈希相关的知识,希望对你有一定的参考价值。

And Yet Another Bracket Sequence

枚举起点, 增加的(肯定在最前面, 增加的)肯定在最后面, 比字典序用hash, 卡了自然溢出。。

#include<bits/stdc++.h>
#define LL long long
#define LD long double
#define ull unsigned long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ALL(x) (x).begin(), (x).end()
#define fio ios::sync_with_stdio(false); cin.tie(0);

using namespace std;

const int N = 2e6 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
const double PI = acos(-1);

template<class T, class S> inline void add(T& a, S b) a += b; if(a >= mod) a -= mod;
template<class T, class S> inline void sub(T& a, S b) a -= b; if(a < 0) a += mod;
template<class T, class S> inline bool chkmax(T& a, S b) return a < b ? a = b, true : false;
template<class T, class S> inline bool chkmin(T& a, S b) return a > b ? a = b, true : false;

const int B = 23333;
int n; char s[N]; int a[N]; LL hs[N], powB[N], powL[N], powR[N]; int cntL[N], cntR[N]; int Log[N]; struct ST int dp[N][21], ty; void build(int n, int b[], int _ty) ty = _ty; for(int i = -(Log[0]=-1); i < N; i++) Log[i] = Log[i - 1] + ((i & (i - 1)) == 0); for(int i = 1; i <= n; i++) dp[i][0] = ty * b[i]; for(int j = 1; j <= Log[n]; j++) for(int i = 1; i+(1<<j)-1 <= n; i++) dp[i][j] = max(dp[i][j-1], dp[i+(1<<(j-1))][j-1]); inline int query(int x, int y) int k = Log[y - x + 1]; return ty * max(dp[x][k], dp[y-(1<<k)+1][k]); rmq; inline LL getHash(int L, int R) return ((hs[R] - hs[L - 1] * powB[R - L + 1] % mod) + mod) % mod; inline LL getPosHash(int i, int len) if(len <= cntL[i]) return powL[len]; if(len <= cntL[i] + n) return (powL[cntL[i]] * powB[len - cntL[i]] % mod + getHash(i, i + len - cntL[i] - 1)) % mod; return (powR[len - cntL[i] - n] + getHash(i, i + n - 1) * powB[len - cntL[i] - n] % mod + powL[cntL[i]] * powB[len - cntL[i]] % mod) % mod; inline char getch(int i, int p) if(p <= cntL[i]) return (; else if(p <= cntL[i] + n) return s[i + p - cntL[i] - 1]; return ); bool check(int p1, int p2, int len) int low = 1, high = len, mid, p = -1; while(low <= high) mid = low + high >> 1; if(getPosHash(p1, mid) != getPosHash(p2, mid)) p = mid, high = mid - 1; else low = mid + 1; if(p == -1) return false; return getch(p1, p) < getch(p2, p); int main() for(int i = powB[0] = 1; i < N; i++) powB[i] = powB[i - 1] * B % mod; for(int i = 1; i < N; i++) powL[i] = (powL[i - 1] * B + () % mod; for(int i = 1; i < N; i++) powR[i] = (powR[i - 1] * B + )) % mod; scanf("%s", s + 1); n = strlen(s + 1); for(int i = 1; i <= n; i++) s[i + n] = s[i]; for(int i = 1; i <= 2 * n; i++) hs[i] = (hs[i - 1] * B + s[i]) % mod; for(int i = 1; i <= 2 * n; i++) a[i] = a[i - 1] + (s[i] == ( ? 1 : -1); rmq.build(2 * n, a, -1); int need = inf; for(int i = 1; i <= n; i++) int mn = rmq.query(i, i + n - 1); if(mn < a[i - 1]) cntL[i] = a[i - 1] - mn; if(a[i + n - 1] + cntL[i] >= a[i - 1]) cntR[i] = a[i + n - 1] + cntL[i] - a[i - 1]; if(cntL[i] + cntR[i] < need) need = cntL[i] + cntR[i]; int who = -1; for(int i = 1; i <= n; i++) if(cntL[i] + cntR[i] > need) continue; if(who == -1) who = i; else if(check(i, who, need + n)) who = i; while(cntL[who]--) putchar((); for(int i = who; i < who + n; i++) putchar(s[i]); while(cntR[who]--) putchar()); puts(""); return 0; /**/

 

以上是关于Codeforces 524F And Yet Another Bracket Sequence 哈希的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces VK Cup 2015 A.And Yet Another Bracket Sequence(后缀数组+平衡树+字符串)

Educational Codeforces Round 69 (Rated for Div. 2) D. Yet Another Subarray Problem 背包dp

Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined) F. Yet Another M

Codeforces 1430G Yet Another DAG Problem 状压dp

Codeforces 903 G. Yet Another Maxflow Problem

Educational Codeforces Round 80. B - Yet Another Meme Problem