QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#830296#3844. LCS Spanning TreezltWA 0ms30512kbC++143.6kb2024-12-24 17:58:422024-12-24 17:58:42

Judging History

This is the latest submission verdict.

  • [2024-12-24 17:58:42]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 30512kb
  • [2024-12-24 17:58:42]
  • Submitted

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'