社区讨论

萌新刚学串串,简单题求调,玄关

CF1037HSecurity参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mli361u0
此快照首次捕获于
2026/02/11 21:49
上周
此快照最后确认于
2026/02/12 10:36
上周
查看原帖
WA on test 9,有没有老哥帮忙瞪一眼
CodeCPP
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ld = long double;
using ull = unsigned long long;
using i128 = __int128;

using PII = pair<int, int>;
using PLL = pair<ll, ll>;

constexpr ll inf = (1ll << 62);
constexpr int N = 2e5 + 10;

template <typename T> void chkmax(T& a, T b) { a = max(a, b); }
template <typename T> void chkmin(T& a, T b) { a = min(a, b); }

int n, tot, lst, ch[N][26], lk[N], len[N], root[N], buc[N], ord[N], cnt;
string s;

struct Node {
	int l, r;
} tree[N << 5];

int clone(int q) { int cl = ++tot; lk[cl] = lk[q]; memcpy(ch[cl], ch[q], sizeof(ch[q])); return cl; }

void extend(char c) {
	int x = c - 'a', cur = ++tot;
	len[cur] = len[lst] + 1;
	while (~lst && !ch[lst][x]) ch[lst][x] = cur, lst = lk[lst];
	if (lst == -1) lk[cur] = 0;
	else {
		int p = lst, q = ch[p][x];
		if (len[p] + 1 == len[q]) lk[cur] = q;
		else {
			int cl = clone(q); len[cl] = len[p] + 1;
			lk[cur] = lk[q] = cl;
			while (~p && ch[p][x] == q) ch[p][x] = cl, p = lk[p];
		}
	}
	lst = cur;
}

#define ls(p) tree[p].l
#define rs(p) tree[p].r

int update(int l, int r, int x, int p) {
	if (!p) p = ++cnt;
	if (l == r) return p;
	int mid = l + r >> 1;
	if (x <= mid) ls(p) = update(l, mid, x, ls(p));
	else rs(p) = update(mid + 1, r, x, rs(p));
	return p;
}

int merge(int l, int r, int x, int y) {
	if (!x || !y) return x | y;
	int p = ++cnt;
	if (l == r) return p;
	int mid = l + r >> 1;
	ls(p) = merge(l, mid, ls(x), ls(y));
	rs(p) = merge(mid + 1, r, rs(x), rs(y));
	return p;
}

int query(int l, int r, int x, int y, int p) {
	if (!p || l > y) return 0;
	if (l == r) return l;
	int mid = l + r >> 1, ans = query(mid + 1, r, x, y, rs(p));
	return (!ans ? query(l, mid, x, y, ls(p)) : ans);
}

#undef ls
#undef rs

void solve() {
	cin >> s;
	n = s.size();
	s = ' ' + s;
	for (int i = 1; i <= n; i++) extend(s[i]), root[i] = update(1, n, i, root[i]);
	for (int i = 1; i <= tot; i++) buc[len[i]]++;
	for (int i = 1; i <= tot; i++) buc[i] += buc[i - 1];
	for (int i = 1; i <= tot; i++) ord[buc[len[i]]--] = i;
	for (int i = tot; i >= 1; i--) root[lk[ord[i]]] = merge(1, n, root[lk[ord[i]]], root[ord[i]]);
	int q;
	cin >> q;
	while (q--) {
		int l, r, p = 0;
		string t;
		bool ok = false;
		cin >> l >> r >> t;
		stack<PII> st;
		st.push({0, -1});
		vector<char> ans;
		for (int i = 0; i < t.size(); i++) {
			int x = t[i] - 'a';
			if (ch[p][x]) p = ch[p][x];
			else break;
			st.push({p, i});
			ans.emplace_back(t[i]);
		}
		t += char('a' - 1);
		while (!st.empty()) {
			int i = st.size();
			auto [p, c] = st.top(); st.pop();
			// cerr << p + 1 << " ";

			auto check = [&](int x) -> bool {
				if (!x) return false;
				int pos = query(1, n, 1, r, root[x]);
				if (pos < l + i - 1) return false;
				return true;
			};

			for (int j = t[c + 1] - 'a' + 1; j < 26; j++) {
				if (check(ch[p][j])) {
					ans.emplace_back(j + 'a');
					ok = true;
					break;
				}
			}
			if (ok) break;
			if (ans.size())	ans.pop_back();
		}
		if (!ans.size()) cout << -1;
		for (auto j : ans) cout << j;
		cout << "\n";
			// cerr << t[c + 1] - 'a' + 1 << "\n";
	}
}

int main() {
	memset(lk, -1, sizeof(lk));
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t = 1;
	// cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...