50 pts 求调
查看原帖
50 pts 求调
958944
Union_Find楼主2025/1/17 22:17

558815152020 WA,其余 AC。

#include <bits/stdc++.h>
using namespace std;
#define ll int
#define il inline
#define N 500005
il ll rd(){
	ll s = 0, w = 1;
	char ch = getchar();
	for (;ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') w = -1;
	for (;ch >= '0' && ch <= '9'; ch = getchar()) s = ((s << 1) + (s << 3) + ch - '0');
	return s * w;
}
ll rt[N], n, m, son[N][26], x, en = 1, rk[N], ex;
string s[N], t;
struct cp{
	string s;
	ll id;
}h[N];
il bool cmp(cp a, cp b){return a.s < b.s;}
ll tr[80 * N], ls[80 * N], rs[80 * N], ep;
void add(ll &p, ll l, ll r, ll x, ll k){
	if (l > x || r < x) return ;
	if (!p) p = ++ep;
	if (l == x && r == x) return tr[p] += k, void(0);
	ll mid = (l + r) >> 1;
	add(ls[p], l, mid, x, k), add(rs[p], mid + 1, r, x, k);
	tr[p] = tr[ls[p]] + tr[rs[p]];
}
ll ask_rk(ll p, ll l, ll r, ll k){
	if (!p) return -1;
	if (l == r) return l;
	ll mid = (l + r) >> 1;
	if (tr[ls[p]] >= k) return ask_rk(ls[p], l, mid, k);
	else return ask_rk(rs[p], mid + 1, r, k - tr[ls[p]]);
}
int main(){
//	freopen ("editor.in", "r", stdin);
//	freopen ("editor.out", "w", stdout);
	n = rd();
	for (int i = 1; i <= n; i++){
		cin >> s[i];
		h[i] = cp{s[i], i};
		ll len = s[i].size(), u = 1;
		for (int j = 0; j < len; j++){
			if (!son[u][s[i][j] - 'a']) son[u][s[i][j] - 'a'] = ++en;
			u = son[u][s[i][j] - 'a'];
		}
	}
	sort (h + 1, h + n + 1, cmp);
	for (int i = 1; i <= n; i++) rk[h[i].id] = i;
	m = rd();
	for (int i = 1; i <= n; i++){
		ll len = s[i].size(), u = 1;
		for (int j = 0; j < len; j++) add(rt[u], 1, m * n + n, m * n + rk[i], 1), u = son[u][s[i][j] - 'a'];
		add(rt[u], 1, m * n + n, m * n + rk[i], 1);
	}
	for (int qq = 1; qq <= m; qq++){
		cin >> t;
		x = rd();
		ll len = t.size(), u = 1;
		for (int i = 0; i < len; i++){
			if (!son[u][t[i] - 'a']){u = -1;break;}
			u = son[u][t[i] - 'a'];
		}if (u == -1){
			puts("404Error");
			continue;
		}ll pk = min(x, tr[rt[u]]), pio = ask_rk(rt[u], 1, m * n + n, pk), poi = pio % n;
		if (poi == 0) poi = n;
		t = h[poi].s;
		len = t.size(), u = 1;
		for (int i = 0; i < len; i++){
			cout << t[i];
			add(rt[u], 1, m * n + n, pio, -1), add(rt[u], 1, m * n + n, pio - n, 1);
			u = son[u][t[i] - 'a'];
		}add(rt[u], 1, m * n + n, pio, -1), add(rt[u], 1, m * n + n, pio - n, 1);puts("");
//		cout << pio << " " << poi << "\n";
	}
	return 0;
}
/*
5
uva
usaco
usa
usssu
konjac
11
u 2
u 2
kkk 1
uv 2
us 3
u 4
u 1
u 2
k 1
u 3
usa 1
*/
2025/1/17 22:17
加载中...