https://atcoder.jp/contests/exawizards2019/tasks/exawizards2019_c
前提知識
解説
https://atcoder.jp/contests/exawizards2019/submissions/4778445
check(x) := x番目にあるゴーレムが全呪文を終えた後にある位置
これを作ってみると、
-1 -1 -1 0 3 4 5 5 N N N N N
のように左側に-1が並び、右側にNが並ぶ単調性があることが分かる。
なので、-1となっている部分、Nとなっている部分を二分探索で探して、その範囲を全体の個数から引けば答え。
int N, Q; string S; char T[201010], D[201010]; //--------------------------------------------------------------------------------------------------- int check(int x) { rep(i, 0, Q) { if (T[i] == S[x]) { if (D[i] == 'L') x--; else x++; } if (x < 0 or N <= x) return x; } return x; } //--------------------------------------------------------------------------------------------------- void _main() { cin >> N >> Q >> S; rep(q, 0, Q) cin >> T[q] >> D[q]; int ans = N; if (check(0) < 0) { int ok = 0, ng = N; while (ok + 1 != ng) { int md = (ok + ng) / 2; if (check(md) < 0) ok = md; else ng = md; } ans -= ok + 1; } if (N <= check(N - 1)) { int ng = -1, ok = N - 1; while (ng + 1 != ok) { int md = (ok + ng) / 2; if (N <= check(md)) ok = md; else ng = md; } ans -= N - ok; } cout << ans << endl; }