int main() { int n, m, l, r; set<pair<int, int> > st; scanf("%d%d", &n, &m); scanf("%s", buf); sa.init(n, buf); rmq.init(n, sa.height); l = 0; r = 1; for (int i = 0; i < m; ++i) { scanf("%s", op); int& t = op[0] == 'L' ? l : r; t += op[1] == '+' ? 1 : -1; int k = sa.rank[l]; int lo = 0, hi = k; while (lo < hi) { int mi = (lo + hi) / 2; if (rmq.value(mi + 1, k + 1) >= r - l) { hi = mi; } else { lo = mi + 1; } } st.insert(make_pair(hi, r - l)); } printf("%d\n", (int)st.size()); return 0; }
int lca(int i, int j) { i = u[i]; j = u[j]; if (i > j) { swap(i, j); } return j2i[rmq.value(i, j + 1)]; }