1 条题解
-
0

#include <bits/stdc++.h> const int N = 400054, LN = 19; int n, q; char s[N], *ptr; int pos[N]; namespace PAM { int p, last, cnt; int d[N][28], fail[N], val[N]; int P[LN][N], dep[N]; void init() {val[1] = -1, p = 0, *fail = cnt = 1;} int get_fail(int x) {for (; ptr[~val[x]] != *ptr; x = fail[x]); return x;} int extend(int x) { int &q = d[p = get_fail(p)][x]; if (!q) fail[++cnt] = d[get_fail(fail[p])][x], val[q = cnt] = val[p] + 2; return p = q; } void initDouble() { int i, j; memcpy(*P, fail, (cnt + 1) << 2); for (j = 0; j < LN - 1; ++j) for (i = 0; i <= cnt; ++i) P[j + 1][i] = P[j][P[j][i]]; for (*dep = 1, i = 2; i <= cnt; ++i) dep[i] = dep[fail[i]] + 1; } int jump_until(int x, int v) {for (int i = LN - 1; i >= 0; --i) val[P[i][x]] >= v && (x = P[i][x]); return x;} int jump_until_d(int x, int d) {for (int i = LN - 1; i >= 0; --i) dep[x] - (1 << i) >= d && (x = P[i][x]); return x;} int LCA(int x, int y) { if (dep[x] < dep[y]) std::swap(x, y); if (x = jump_until_d(x, dep[y]), x == y) return x; for (int i = LN - 1; i >= 0; --i) if (P[i][x] != P[i][y]) x = P[i][x], y = P[i][y]; return fail[x]; } } int main() { int i = 0, d, t, l1, l2, r1, r2; scanf("%d%d%s", &n, &q, s + 1), s[n + 1] = 123, s[n + 2] = 124; std::reverse_copy(s + 1, s + (n + 1), s + (n + 3)); PAM::init(); for (ptr = s + 1; *ptr; ++ptr) pos[++i] = PAM::extend(*ptr - 97); PAM::initDouble(); for (; q; --q) { scanf("%d%d%d%d", &r1, &l1, &l2, &r2), l1 = 2 * n + 3 - l1, r1 = 2 * n + 3 - r1; d = std::min(r1 - l1, r2 - l2) + 1, t = PAM::LCA(pos[r1], pos[r2]); printf("%d\n", -PAM::val[PAM::val[t] > d ? PAM::fail[PAM::jump_until(t, d + 1)] : t]); } return 0; }
- 1
信息
- ID
- 1945
- 时间
- 1750ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者