题解:CF76C Mutation
本蒟蒻第一次写紫题题解,大佬轻喷。
洛谷传送门
codeforces传送门
题目大意:
题目写的很直白明了,这里不写了。
思路:
我们即询问有多少种删除的字符集是合法的,只需要对于每种删除的字符集计算出相邻字符产生的代价即可。
考虑对于两个位置
首先显然要有
考虑对于一组
然后我们对
这样的话时间复杂度为
代码:
AC记录
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10, K = 25;
int n, k, T, sum, b[K], t[K], a[K][K], f[1 << K], ans;
string s;
void init() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k >> T >> s;
for (int i = 0; i < n; i++) {
s[i] -= 'A';
}
for (int i = 0; i < n; i++) {
sum |= 1 << s[i];
}
for (int i = 0; i < k; i++) {
cin >> t[i];
}
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
cin >> a[i][j];
}
}
return ;
}
int main() {
init();
memset(b, -1, sizeof b);
for (int i = 0; i < k; i++) {
f[1 << i] = t[i];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
if (b[j] >= 0) {
if (!((b[j] >> j) & 1) && !((b[j] >> s[i]) & 1)) {
f[b[j]] += a[j][s[i]];
f[b[j] | (1 << j)] -= a[j][s[i]];
f[b[j] | (1 << s[i])] -= a[j][s[i]];
f[b[j] | (1 << j) | (1 << s[i])] += a[j][s[i]];
}
b[j] |= (1 << s[i]);
}
}
b[s[i]] = 0;
}
for (int i = 0; i < k; i++) {
for (int j = 0; j < 1 << k; j++) {
if ((j >> i) & 1) {
f[j] += f[j ^ (1 << i)];
}
}
}
for (int i = 0; i < 1 << k; i++) {
if ((i & sum) == i && f[i] <= T && i != sum) {
ans++;
}
}
cout << ans;
return 0;
}