이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<iostream>
#include<bitset>
using namespace std;
#define forn(i, n) for(int i=0; i<(int)n; ++i)
const int MAXN=10010;
int n, m, pr[MAXN][2];
bool pb[MAXN][2];
string info, ans;
bitset<MAXN> arr[MAXN], wi[MAXN], brr[MAXN], one("1"), zero("0"), nuli, uni, add;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m >> info;
ans.assign(m, '?');
forn(i, m){
char c1, c2;
int a1, a2;
cin >> c1 >> a1 >> c2 >> a2;
--a1, --a2;
bitset<MAXN> bi1 = c1=='x'? (one<<a1) : arr[a1];
bitset<MAXN> bi2 = c2=='x'? (one<<a2) : arr[a2];
arr[i]=bi1|bi2;
pb[i][0]=(c1=='x'), pb[i][1]=(c2=='x');
pr[i][0]=a1, pr[i][1]=a2;
}
forn(i, m) if(info[i]=='0') nuli|=arr[i];
nuli=~nuli;
forn(i, m) if(info[i]=='1') uni|=(1<<i);
forn(i, m){
arr[i]&=nuli;
if(arr[i].count()==0) ans[i]='0';
}
forn(i, m) forn(j, n) if((arr[i]&(one<<j)).count()) wi[j]|=(one<<i);
forn(i, n) if((nuli&(one<<i)).count()==0) wi[i]=~zero;
forn(i, m){
bitset<MAXN> b1 = pb[i][0]? wi[pr[i][0]] : brr[pr[i][0]];
bitset<MAXN> b2 = pb[i][1]? wi[pr[i][1]] : brr[pr[i][1]];
brr[i]=b1&b2;
}
forn(i, m) if(info[i]=='1') add|=brr[i];
forn(i, m) if((add&(one<<i)).count()) ans[i]='1';
cout << ans << endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |