QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#830296 | #3844. LCS Spanning Tree | zlt | WA | 0ms | 30512kb | C++14 | 3.6kb | 2024-12-24 17:58:42 | 2024-12-24 17:58:42 |
Judging History
answer
// Problem: P9664 [ICPC2021 Macao R] LCS Spanning Tree
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P9664
// Memory Limit: 1 MB
// Time Limit: 5000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define uint unsigned
#define mems(a, x) memset((a), (x), sizeof(a))
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<int, int> pii;
const int maxn = 4100000;
int n, m, sa[maxn], id[maxn], old[maxn << 1], rk[maxn], cnt[maxn], h[maxn], a[maxn], len[maxn];
char s[maxn];
inline void build() {
int m = 200 + n;
for (int i = 1; i <= n; ++i) {
rk[i] = a[i];
++cnt[rk[i]];
}
for (int i = 1; i <= m; ++i) {
cnt[i] += cnt[i - 1];
}
for (int i = n; i; --i) {
sa[cnt[rk[i]]--] = i;
}
for (int w = 1; w < n; w <<= 1) {
int tot = 0;
for (int i = n - w + 1; i <= n; ++i) {
id[++tot] = i;
}
for (int i = 1; i <= n; ++i) {
if (sa[i] > w) {
id[++tot] = sa[i] - w;
}
}
for (int i = 1; i <= m; ++i) {
cnt[i] = 0;
}
for (int i = 1; i <= n; ++i) {
++cnt[rk[id[i]]];
old[i] = rk[i];
}
for (int i = 1; i <= m; ++i) {
cnt[i] += cnt[i - 1];
}
for (int i = n; i; --i) {
sa[cnt[rk[id[i]]]--] = id[i];
}
for (int i = 1, p = 0; i <= n; ++i) {
if (old[sa[i]] == old[sa[i - 1]] && old[sa[i] + w] == old[sa[i - 1] + w]) {
rk[sa[i]] = p;
} else {
rk[sa[i]] = ++p;
}
}
}
h[1] = 0;
for (int i = 1, k = 0; i <= n; ++i) {
if (rk[i] == 1) {
continue;
}
if (k) {
--k;
}
while (i + k <= n && sa[rk[i] - 1] + k <= n && a[i + k] == a[sa[rk[i] - 1] + k]) {
++k;
}
h[rk[i]] = k;
}
}
int fa[maxn];
pii b[maxn];
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
inline bool merge(int x, int y) {
x = find(x);
y = find(y);
if (x != y) {
fa[x] = y;
return 1;
} else {
return 0;
}
}
int pre[maxn], nxt[maxn], f[maxn], g[maxn];
void solve() {
scanf("%d", &m);
for (int i = 1; i <= m; ++i) {
scanf("%s", s + 1);
for (int j = 1; s[j]; ++j) {
a[++n] = s[j];
++len[i];
}
a[++n] = 200 + i;
}
if (n >= 100) {
printf("n: %d\n", n);
return;
}
build();
for (int i = 1; i <= n; ++i) {
fa[i] = i;
}
int s = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= len[i]; ++j) {
merge(rk[s + j], rk[s + j + 1]);
}
s += len[i] + 1;
}
ll ans = 0;
while (1) {
bool fl = 1;
for (int i = 1; i <= n && fl; ++i) {
fl &= (find(i) == find(1));
}
if (fl) {
break;
}
for (int i = 1; i <= n; ++i) {
find(i);
b[i] = mkp(-1e8, 0);
}
for (int i = 1, j = 1; i <= n; i = (++j)) {
while (j < n && fa[j + 1] == fa[i]) {
++j;
}
int mn = 1e9;
for (int k = i; k <= j; ++k) {
pre[k] = i - 1;
nxt[k] = j + 1;
mn = min(mn, h[k]);
f[k] = mn;
}
mn = 1e9;
for (int k = j; k >= i; --k) {
mn = min(mn, h[k]);
g[k] = mn;
}
}
for (int i = 1; i <= n; ++i) {
int j = pre[i];
if (j) {
b[fa[i]] = max(b[fa[i]], mkp(f[i], j));
}
j = nxt[i];
if (j <= n) {
int d = h[j];
if (i + 1 < j) {
d = min(d, g[i + 1]);
}
b[fa[i]] = max(b[fa[i]], mkp(d, j));
}
}
for (int i = 1; i <= n; ++i) {
if (fa[i] == i && merge(i, b[i].scd)) {
ans += b[i].fst;
}
}
}
printf("%lld\n", ans);
}
int main() {
int T = 1;
// scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 30512kb
input:
4 icpc macau regional contest
output:
4
result:
ok single line: '4'
Test #2:
score: 0
Accepted
time: 0ms
memory: 30472kb
input:
3 ababa babab aba
output:
7
result:
ok single line: '7'
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 16244kb
input:
26 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
output:
n: 2000024
result:
wrong answer 1st lines differ - expected: '0', found: 'n: 2000024'