이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int nu = (1<<20);
int n, query, f[2][nu];
string s;
vector<int> cnt0, cnt1, cnt2;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> query >> s;
for(int i = 0; i < (1<<n); ++i) f[0][i] = f[1][i] = s[i]-48;
for(int i = 0; i < n; ++i)
for(int j = 0; j < (1<<n); ++j)
if((1<<i)&j) f[0][j] += f[0][j^(1<<i)];
else f[1][j] += f[1][j^(1<<i)];
while(query > 0)
{
string x;
cin >> x;
int num0 = 0; int num1 = 0; int num2 = 0; int ans = 0;
for(int i = 0; i < int(x.size()); ++i)
if(x[i] == '0') cnt0.push_back(n-i-1), num0 += (1<<(n-i-1)); else if(x[i] == '1') cnt1.push_back(n-i-1), num1 += (1<<(n-i-1));
else cnt2.push_back(n-i-1), num2 += (1<<(n-i-1));
if(int(cnt1.size()) <= n/3)
{
int len = int(cnt1.size());
for(int i = 0; i < (1<<len); ++i)
{
int num = 0; int d = 0;
for(int j = 0; j < len; ++j)
if((1<<j)&i) num += (1<<cnt1[j]), d++;
if(d&1) ans -= f[0][num|num2]; else ans += f[0][num|num2];
}
ans = abs(ans);
}
else if(int(cnt0.size()) <= n/3)
{
int len = int(cnt0.size());
for(int i = 0; i < (1<<len); ++i)
{
int num = 0; int d = 0;
for(int j = 0; j < len; ++j)
if((1<<j)&i) num += (1<<cnt0[j]), d++;
if(d&1) ans -= f[1][num|num1]; else ans += f[1][num|num1];
}
ans = abs(ans);
}
else
{
int len = int(cnt2.size());
for(int i = 0; i < (1<<len); ++i)
{
int num = 0; int d = 0;
for(int j = 0; j < len; ++j)
if((1<<j)&i) num += (1<<cnt2[j]), d++;
ans += s[num|num1]-48;
}
}
cout << ans << '\n';
cnt0.clear(); cnt1.clear(); cnt2.clear();
--query;
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |