社区讨论
萌新刚学串串,简单题求调,玄关
CF1037HSecurity参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mli361u0
- 此快照首次捕获于
- 2026/02/11 21:49 上周
- 此快照最后确认于
- 2026/02/12 10:36 上周
WA on test 9,有没有老哥帮忙瞪一眼
Code
CPP#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 条回复,欢迎继续交流。
正在加载回复...