{LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度 题解
解法一
由 parent 树的性质得到,前缀 std::set
可以求出。由启发式合并的复杂度可以知道,这样做的总复杂度是
代码:
#include <bits/stdc++.h>
#define N 2000005
#define M 2
using namespace std;
int n, m;
char s[N];
int tot = 1, lst = 1;
struct SAM {
int len, fa;
int s[M];
} sam[N];
set<int>st[N];
void insert(int c, int x) {
int p = lst, np = lst = ++tot;
sam[np].len = sam[p].len + 1;
for (; !sam[p].s[c]; p = sam[p].fa) sam[p].s[c] = np;
if (!p) sam[np].fa = 1;
else {
int q = sam[p].s[c];
if (sam[q].len == sam[p].len + 1) sam[np].fa = q;
else {
int nq = ++tot;
sam[nq] = sam[q], sam[nq].len = sam[p].len + 1;
sam[np].fa = sam[q].fa = nq;
for (; sam[p].s[c] == q; p = sam[p].fa) sam[p].s[c] = nq;
}
}
st[lst].insert(x);
}
vector<int>v[N];
struct node {
int r, vl;
};
vector<node>upd[N], que[N];
void dfs(int x) {
for (auto y : v[x]) {
dfs(y);
if (st[x].size() < st[y].size()) swap(st[x], st[y]);
st[x].insert(-1e9), st[x].insert(1e9);
for (auto i : st[y]) {
auto it = --st[x].upper_bound(i);
if ((*it) != -1e9) upd[*it].push_back({i, sam[x].len});
it = st[x].lower_bound(i);
if ((*it) != 1e9) upd[i].push_back({*it, sam[x].len});
}
st[x].erase(-1e9), st[x].erase(1e9);
st[x].insert(st[y].begin(), st[y].end());
st[y].clear();
}
}
int lbt(int x) {
return x & -x;
}
int tr[N];
void add(int x, int vl) {
while (x <= n) tr[x] = max(tr[x], vl), x += lbt(x);
}
int ask(int x) {
int ans = 0;
while (x) ans = max(tr[x], ans), x -= lbt(x);
return ans;
}
int ans[N];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
cin >> s;
for (int i = 0; i < n; i++) insert(s[i] - '0', i + 1);
for (int i = 2; i <= tot; i++) v[sam[i].fa].push_back(i);
dfs(1);
for (int i = 1; i <= m; i++) {
int l, r;
cin >> l >> r;
que[l].push_back({r, i});
}
for (int i = n; i >= 1; i--) {
for (auto p : upd[i]) add(p.r, p.vl);
for (auto p : que[i]) ans[p.vl] = ask(p.r);
}
for (int i = 1; i <= m; i++) cout << ans[i] << "\n";
return 0;
}
解法二
实际上本题是信息搜集题,我将给出符合题目描述的图片,相信大家能推断出本题真正的答案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!