1 条题解

  • 0
    @ 2026-1-15 14:57:56

    #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
    上传者