蒙青创五一集训模拟考入门组v2

Done OI Start at: 2025-5-4 8:30 3.3 hour(s) Host: 36
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 50;
int a[N], f[55]; //f[i]二进制的第i位为1的下标的数的亦或和
int n;
string s;

int main() {
	freopen("hamming.in","r",stdin);
	freopen("hamming.out","w",stdout);
	cin >> n >> s;
	int t = ceil(log2(n + 1));
	for (int i = 1; i <= n + t + 1; i++) {
		a[i] = s[i - 1] - '0';
	}
	int C = 0;
	for (int i = 1; i <= n; i++) {
		C ^= a[i];
		int tmp = i;
		int cnt = 0;
		while (tmp) {
			cnt++;
			if (tmp % 2 == 1)
				f[cnt] ^= a[i];
			tmp /= 2;
		}
	}
	if (C != a[n + t + 1]) {
		int res = 0;
		for (int i = 1; i <= t; i++) {
			res = ((f[i] ^ (a[n + i])) << (i - 1)) + res;
		}
		a[res] ^= 1;
	}
	for (int i = 1; i <= n; i++) {
		cout << a[i];
	}
	return 0;
}
/*
f[j]背包容量为j的最大价值
f[j][k]背包容量为j能否剩下价值为k的物品
f[j][k] |= f[j-a[i]][k]
f[j][k] |= f[j-a[i]][k-a[i]]
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int n, m, a[N], f[N][N];

int main() {
	freopen("backpack.in","r",stdin);
	freopen("backpack.out","w",stdout);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	f[0][0] = 1;
	for (int i = 1; i <= n; i++) {
		for (int j = m; j >= a[i]; j--) {
			for (int k = 0; k <= j; k++) {
				f[j][k] |= f[j - a[i]][k];
				if (k >= a[i])
					f[j][k] |= f[j - a[i]][k - a[i]];
			}
		}
	}
	for (int i = 0; i <= m; i++) {
		if (f[m][i]) {
			cout << i << " ";
		}
	}
	return 0;
}
Status
Done
Rule
OI
Problem
4
Start at
2025-5-4 8:30
End at
2025-5-4 11:50
Duration
3.3 hour(s)
Host
Partic.
36