1 条题解
-
0

#include <bits/stdc++.h> typedef long long ll; typedef std::pair <int, int> pr; typedef std::vector <pr> vector; const int N = 200054; char s[N]; int n, m, A, B; int a[N], b[N]; vector R[N * 2]; inline void up(ll &x, const ll y) {x < y ? x = y : 0;} namespace SAM { const int N = ::N * 2, LN = 19; int p, np, cnt, len; int pa[N], d[N][26], val[N]; int fy[N], P[LN][N]; inline void init(int n) {len = 0, np = cnt = 1, memset(pa, 0, (n + 10) << 3), memset(d, 0, (n + 10) * 208);} #define q d[p][x] void extend(int x) { for (p = np, val[np = ++cnt] = val[p] + 1; p && !q; q = np, p = pa[p]); if (!p) pa[np] = 1; else if (val[p] + 1 == val[q]) pa[np] = q; else { int nq = ++cnt; val[nq] = val[p] + 1, memcpy(d[nq], d[q], 104); pa[nq] = pa[q], pa[np] = pa[q] = nq; for (int Q = q; p && q == Q; q = nq, p = pa[p]); } fy[++len] = np; } #undef q void initDouble() { int i, j; memcpy(*P, pa, (cnt + 1) << 2); for (j = 0; j < LN - 1; ++j) for (i = 1; i <= cnt; ++i) P[j + 1][i] = P[j][P[j][i]]; } int jump_until(int t, int v) {for (int i = LN - 1; i >= 0; --i) val[P[i][t]] >= v && (t = P[i][t]); return t;} inline int extract(int l, int r) {return jump_until(fy[n - l], r - l);} } namespace Graph { const int N = 1000054, M = 2003731; int V1, V2, V, E; int w[N]; int to[M], first[N], next[M]; int deg[N], que[N]; ll f[N]; inline void init(int _V1, int _V2) {V = (V1 = _V1) + (V2 = _V2), E = 0, memset(first, 0, (V + 1) << 2), memset(deg, 0, (V + 1) << 2);} inline void addedge(int u, int v) {to[++E] = v, next[E] = first[u], first[u] = E, ++deg[v];} ll main() { int i, h, t = 0, x, y; ll ans = 0; memset(w + (V1 + 1), 0, V2 << 2); for (i = 1; i <= V; ++i) if (!deg[i]) que[t++] = i; for (h = 0; h < t; ++h) for (i = first[x = que[h]]; i; i = next[i]) if (!--deg[y = to[i]]) que[t++] = y; if (t != V) return -1; for (h = t - 1; h >= 0; --h) { for (f[x = que[h]] = 0, i = first[x]; i; i = next[i]) up(f[x], f[to[i]]); up(ans, f[x] += w[x]); } return ans; } } void work() { int i, l, r, u, v, la; scanf("%s%d", s, &A), n = strlen(s), SAM::init(n); for (i = n - 1; i >= 0; --i) SAM::extend(s[i] - 97); SAM::initDouble(); for (i = 1; i <= A; ++i) scanf("%d%d", &l, &r), Graph::w[i] = r - --l, a[i] = SAM::extract(l, r), R[a[i]].emplace_back(r - l, -i); scanf("%d", &B); for (i = 1; i <= B; ++i) scanf("%d%d", &l, &r), Graph::w[A + i] = 0, b[i] = SAM::extract(--l, r), R[b[i]].emplace_back(r - l, -(A + i)); Graph::init(A + B, SAM::cnt); for (i = 1; i <= A; ++i) Graph::addedge(A + B + SAM::pa[a[i]], i); for (i = 1; i <= B; ++i) Graph::addedge(A + i, A + B + b[i]); for (i = 2; i <= SAM::cnt; ++i) { Graph::addedge(A + B + SAM::pa[i], A + B + i); std::sort(R[i].begin(), R[i].end()), la = 0; for (pr v : R[i]) {if (la) Graph::addedge(la, -v.second); -v.second > A && (la = -v.second);} R[i].clear(); } scanf("%d", &m); for (i = 0; i < m; ++i) scanf("%d%d", &u, &v), Graph::addedge(u, A + v); printf("%lld\n", Graph::main()); } int main() { int T; for (scanf("%d", &T); T; --T) work(); return 0; }
- 1
信息
- ID
- 1899
- 时间
- 6000ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 19
- 已通过
- 7
- 上传者