求助 WA on 19
查看原帖
求助 WA on 19
718722
adjective楼主2024/1/17 22:04
#include<bits/stdc++.h>
using namespace std;

const int NY=500005,N=10000005;

//关于编号
//1-n为?填0的
//n+1-2*n为前缀都不选
//2*n+1-3*n为后缀都不选
//3*n+1-4*n为前缀选择

//4*n+1-5*n为?填1的
//5*n+1-8*n类似 

int n;
string ac[NY],bc[NY];
int fn[NY],ans[NY];

int ff(int x){
	if(x<=n) return x+4*n;
	else return x-4*n;
}

int head[N*2],ne[N*4],v[N*4],tot1=1;
void add(int x,int y){ne[++tot1]=head[x]; head[x]=tot1; v[tot1]=y;}

//tarjan
int dfn[N],low[N],vis[N],sta[N],top=0,scc[N],scccnt=0,cnt=0;
void tarjan(int u){
	dfn[u]=low[u]=++cnt; sta[++top]=u; vis[u]=1;
	for(int i=head[u];i;i=ne[i]){
		if(!dfn[v[i]]){
			tarjan(v[i]);
			low[u]=min(low[u],low[v[i]]);
		}
		else if(vis[v[i]]) low[u]=min(low[u],dfn[v[i]]);
	}
	if(dfn[u]==low[u]){
		scccnt++;
		while(top&&sta[top+1]!=u){
			scc[sta[top]]=scccnt;
			vis[sta[top]]=0; top--;
		}	
	}
}

//trie 
int trie[NY][3],tot=1,num[N];
int visd[NY];
vector<int>vc[NY];
void ins(string a,int id){
	int d=1;
	for(int i=0;i<a.length();i++){
		int dw=a[i]-'0';
		if(!trie[d][dw]) trie[d][dw]=++tot;
		d=trie[d][dw];
	}
	num[id]=d;
	vc[d].push_back(id);
}
void dfs(string a,int id){
	int d=1;
	for(int i=0;i<a.length()-1;i++){
		int dw=a[i]-'0';
		d=trie[d][dw];
		if(vc[d].size()){
		//	cout<<id<<" "<<vc[d][vc[d].size()-1]<<endl;
			add(id,vc[d][vc[d].size()-1]+n);
			add(vc[d][vc[d].size()-1]+3*n,ff(id));
		}
	}	
}

//add
void addz(int l,int r){
	for(int i=l;i<=r;i++){
		int fa=num[i];
//		cout<<i<<" "<<fa<<endl; 
		if(visd[fa]) continue;
		visd[fa]=1;
		for(int j=0;j<vc[fa].size();j++){
			int la=0,en=0,d=vc[fa][j];
			add(d+n,ff(d)); add(d+2*n,ff(d)); add(d,d+3*n);
			if(j-1>=0){
				la=vc[fa][j-1];
				add(d+n,la+n); add(d,la+n);
				add(la+3*n,d+3*n);
			}
			if(j+1<vc[fa].size()){
				en=vc[fa][j+1];
				add(d+2*n,en+2*n);
				add(d,en+2*n);
			}
		}
	}
}
void addt(int l,int r){
	for(int i=l;i<=r;i++){
		if(i<=n) dfs(ac[i],i);
		else dfs(bc[i-4*n],i);
	}
}

int main(){
	
	scanf("%d", &n);
	
	for(int i=1;i<=n;i++){
		cin>>ac[i];
		bc[i]=ac[i];
		for(int j=0;j<ac[i].length();j++){
			if(ac[i][j]=='?'){
				fn[i]=1;
				ac[i][j]='0';
				bc[i][j]='1';
			}
		}
		ins(ac[i],i); ins(bc[i],i+4*n);
	}
	
	addz(1,n); addz(4*n+1,5*n);
	addt(1,n); addt(4*n+1,5*n);
	
	for(int i=1;i<=8*n;i++) if(!dfn[i]) tarjan(i);
	
	for(int i=1;i<=n;i++){
		if(scc[i]==scc[i+4*n]&&fn[i]){
			cout<<"NO"<<endl;
			return 0;
		}
		else if(scc[i]<scc[i+4*n]) ans[i]=1;
		else ans[i]=2;
	}
	
	cout<<"YES"<<endl;
	for(int i=1;i<=n;i++){
		if(ans[i]==1) cout<<ac[i]<<endl;
		else cout<<bc[i]<<endl;
	}
	
	return 0;
}

2024/1/17 22:04
加载中...