1 条题解

  • 0
    @ 2026-1-15 10:59:32

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