제출 #1339581

#제출 시각아이디문제언어결과실행 시간메모리
1339581MasterDebaterIli (COI17_ili)C++20
7 / 100
3 ms2884 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10,pot[8]={1,10,100,1000,10000,100000,1000000,10000000};
int n,m,a[N*2],out[N*2][2];
vector<int>in[N*2];
string s;
queue<int>q;
bool b[N*2][N*2];
void provjera(int i){
	//cout<<"provjera: "<<i-n+1<<'\n';
	queue<int>q;
	q.push(i);
	b[i][i]=1;
	while(!q.empty()){
		int node=q.front();
		//cout<<node<<'\n';
		q.pop();
		if(out[node][0]!=-1 and !b[out[node][0]][i])b[out[node][0]][i]=1,q.push(out[node][0]);
		if(out[node][1]!=-1 and !b[out[node][1]][i])b[out[node][1]][i]=1,q.push(out[node][1]);
		for(int j=0;j<in[node].size();j++)if(!b[in[node][j]][i] and b[out[in[node][j]][0]][i] and b[out[in[node][j]][1]][i])b[in[node][j]][i]=1,q.push(in[node][j]);
	}
	return;
}
int main(){
	cin>>n>>m>>s;
	for(int i=0;i<n+m;i++)out[i][0]=out[i][1]=a[i]=-1;
	for(int i=0;i<m;i++){
		if(s[i]=='?')a[i+n]=-1;
		else a[i+n]=(s[i]-'0');
	}
	for(int i=0;i<m;i++){
		//cout<<"__________\n";
		char c1,c2;
		int x1=0,x2=0;
		string s1,s2;
		cin>>s1>>s2;
		c1=s1[0];
		c2=s2[0];
		for(int j=1;j<s1.size();j++)x1+=pot[s1.size()-j-1]*(s1[j]-'0');
		for(int j=1;j<s2.size();j++)x2+=pot[s2.size()-j-1]*(s2[j]-'0');
		x1=x1-1+(c1=='c')*n;
		x2=x2-1+(c2=='c')*n;
		in[x1].push_back(i+n);
		in[x2].push_back(i+n);
		out[i+n][0]=x1,out[i+n][1]=x2;
		if(s[i]!='?')a[i+n]=(s[i]-'0'),q.push(i+n);
	}
	for(int i=0;i<m;i++)provjera(i+n);
	/*cout<<"b:\n";
	for(int i=0;i<m;i++){
		for(int j=0;j<n+m;j++)cout<<b[j][i+n]<<' ';
		cout<<'\n';
	}*/
	while(!q.empty()){
		int node=q.front();
		q.pop();
		//if(node>=n)cout<<"c ";
		//else cout<<"x ";
		//cout<<node%n+1<<' '<<a[node]<<'\n';
		if(a[node]==0){
			if(a[out[node][0]]==-1)q.push(out[node][0]),a[out[node][0]]=0;
			if(a[out[node][1]]==-1)q.push(out[node][1]),a[out[node][1]]=0;
			for(int i=0;i<in[node].size();i++){
				if(a[in[node][i]]==1){
					if(a[out[in[node][i]][0]]==-1)a[out[in[node][i]][0]]=1,q.push(out[in[node][i]][0]);
					if(a[out[in[node][i]][1]]==-1)a[out[in[node][i]][1]]=1,q.push(out[in[node][i]][1]);
				}
				if(a[in[node][i]]==-1){
					if(a[out[in[node][i]][0]]==0 and a[out[in[node][i]][1]]==0)a[in[node][i]]=0,q.push(in[node][i]);
				}
			}
		}
		else{
			for(int i=0;i<m;i++)if(i+n!=node and b[node][i+n] and a[i+n]==-1)a[i+n]=1,q.push(i+n);
		}
	}
	for(int i=0;i<m;i++){
		if(a[i+n]==-1)cout<<'?';
		else cout<<a[i+n];
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...