01Trie求调
查看原帖
01Trie求调
524911
PassName楼主2024/10/20 15:22

RT,将 tot 初始值赋个 1 然后函数里 p=1 就过了,但是原代码问题在哪

#include <bits/stdc++.h>

#define rint register int
#define int long long
#define endl '\n'

using namespace std;

const int N = 5e5 + 5;
const int M = 3e7 + 5;

int T, n, m;
int a[N], b[N];
int ch[M][2], cnt[M], tot;

void insert(int x, int k) 
{
	int p = 0;
	for (rint i = 30; i >= 0; i--) 
	{
		int t = x >> i & 1;
		if (k >> i & 1) 
		{
			if (!ch[p][t])  ch[p][t] = ++tot;
			if (!ch[p][!t]) ch[p][!t] = ++tot;
			cnt[ch[p][t]]++;
			p = ch[p][!t];
		} 
		else 
		{
			if (!ch[p][t]) ch[p][t] = ++tot;
			p = ch[p][t];
		}
	}
	cnt[p]++;
}

int query(int x) 
{
	int p = 0, res = 0;
	for (rint i = 30; i >= 0; i--) 
	{
		int t = x >> i & 1;
		if (ch[p][t]) 
		{
			p = ch[p][t];
		}
	}
	return res;
}


signed main() 
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
	cin >> T >> n >> m;
	for (rint i = 1; i <= n; i++) cin >> a[i];
	for (rint i = 1; i <= n; i++) cin >> b[i];
	for (rint i = 1; i <= n; i++) insert(a[i], b[i]);
	int last = 0;
	for (rint i = 1; i <= m; i++) 
	{
		int k;
		cin >> k;
		k ^= T * last;
		int ans = query(k);
		cout << ans << endl;
		last = ans;
	}
	return 0;
}
2024/10/20 15:22
加载中...