The 2024 ICPC Asia Hangzhou Regional Contest
外榜 https://board.xcpcio.com/icpc/49th/hangzhou
铜线: 4题739 ~ 5题726
银线: 5题723-370 ~ 6题552
金线: 6题495-470 7题+
难度(个人感觉):
纯签: AK
半签: H
Easy: EM
Mid:
Hard: BF 主要是本蒟蒻不会SCC(bushi
别的难以触碰
A
题意
三个字符串\(s_1 s_2 s_3\),重新映射26个小写字母,问能不能存在映射方案使得\(s_1=s_2\)且\(s_1 \neq s_3\)。
思路
先根据长度特判一下,如果全等长,再把\(s_2\)每个字母全变成\(s_1\)的,直接判断\(s_1s_3\)是不是相等就好了。
代码
[code]struct DSU { std::vector fa, siz; DSU(int n) : fa(n + 1), siz(n + 1, 1) { std::iota(all(fa), 0); } int find(int x) { while (x != fa[x]) { x = fa[x] = fa[fa[x]]; } return x; } bool merge(int x, int y) { x = find(x); y = find(y); if (x == y) return 0; siz[x] += siz[y]; fa[y] = x; return 1; }};void solve() { string a, b, c; cin >> a >> b >> c; int x = a.size(), y = b.size(), z = c.size(); if (x != y) { cout m >> k; vector p(n * m); for (int i = 0; i < n * m; i++) { cin >> p; } int ans = n * m; std::vector cnt(n); for (int i = n * m - 1; i >= 0; i--) { int t = (p - 1) / m; cnt[t]++; if (cnt[t] > k; struct node { int l, r, len; }; vector a(k); for (int i = 0; i < k; i++) { auto &[l, r, len] = a; cin >> l >> r; len = r - l + 1; } std::sort(all(a), [&] (auto x, auto y) { return x.len > y.len; }); if (k == 1) { for (int i = 0; i < n; i++) { cout r; id = i + 1; if (r >= F) { F = std::min(F, l); } ans += r - l; } std::sort(all(a), [&] (auto a, auto b) { return a.r == b.r ? a.l < b.l : a.r > b.r; }); std::deque q; vector vis(n + 1); int now = a[0].r; int add = 2e9; for (int i = 0; i < n; i++) { if (a.l >= F) { add = std::min(add, a.l - F); if (now > a.r) { ans += now - a.r; } if (a.l < now) { q.push_front(a.id); vis[a.id] = 1; } now = std::min(now, a.l); } } for (int i = 0; i < n; i++) { if (!vis[a.id]) { q.push_back(a.id); } } if (add != 2e9) ans += add; cout |