卡拉米求助卡常,悬关
查看原帖
卡拉米求助卡常,悬关
1121412
Cute_Fish楼主2024/3/3 14:04

rt

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define re register 
const int N=1e5+7;
int n,m,d,head1[N],head2[N],cnt1=0,cnt2=0,tot=0,rp=0,q[N],f[N];
string s;
int wh[17],num[N][4];
char si[N][4];
bool vis[N],flag=false;
struct edge{
	int to,next,dis;
}e1[N<<1],e2[N<<1];
inline void add1(int from,int to,int dis){
	e1[++cnt1]={to,head1[from],dis};
	head1[from]=cnt1;
}
inline void add2(int from,int to,int dis){
	e2[++cnt2]={to,head2[from],dis};
	head2[from]=cnt2;
}
inline void add(int u,int v,int w){
	add1(u,v,w);
	add2(v,u,w);
}
inline void dfs1(int u){
	vis[u]=1;
	for(re int i=head1[u];i;i=e1[i].next){
		int v=e1[i].to;
		if(!vis[v])dfs1(v);
	}
	q[++tot]=u;
}
inline void dfs2(int u,int fa){
	vis[u]=0,f[u]=fa;
	for(re int i=head2[u];i;i=e2[i].next){
		int v=e2[i].to;
		if(vis[v])dfs2(v,fa);
	}
}
inline int get(int k,char x){
    if(s[k]=='a'){
        if(x=='B')return k; 
        return k+n;
    }
    if(s[k]=='b'){
        if(x=='A')return k;
        return k+n;
    }
    if(s[k]=='c'){
        if(x=='A')return k;
        return k+n;
    }
}
inline int find(int a){
	if(a>n)return a-n;
	return a+n;
}
inline void init(){
	cnt1=cnt2=tot=rp=0;
	memset(head1,0,sizeof(head1));
	memset(head2,0,sizeof(head2));
	memset(q,0,sizeof(q));
	memset(f,0,sizeof(f));
	memset(vis,0,sizeof(vis));
}
inline bool work(){
	init();
	for(re int i=1;i<=m;++i){
        int a=num[i][1];
		char ha=si[i][1];           
        int b=num[i][2];
		char hb=si[i][2];
        if(s[a]==ha+32)continue;       
        int n1=get(a,ha),n2=get(b,hb);               
        if(s[b]==hb+32)add(n1,find(n1),0);        
        else{
            add(n1,n2,0);           
            add(find(n2),find(n1),0);      
        }
    }
	for(re int i=1;i<=2*n;++i){
		if(!vis[i])dfs1(i);
	}
	for(re int i=2*n;i>=1;--i){
		if(vis[q[i]])dfs2(q[i],++rp);
	}
	for(re int i=1;i<=n;++i){
		if(f[i]==f[i+n]){
			return 0;
		}
	}
	return 1; 
}
inline void dfs(int k){
	if(k>d){
        if(work())flag=1;                 
        return ;
    } 
    for(re int i=0;i<2;++i){
        s[wh[k]]=i+'a';         
        dfs(k+1);
        if(flag)return;
    } 
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	s+='#';
	for(re int i=1;i<=n;++i){
		char ch;cin>>ch;
		s+=ch;
		if(ch=='x')wh[++d]=i;
	}
	cin>>m;
	for(re int i=1;i<=m;++i){
		cin>>num[i][1]>>si[i][1]>>num[i][2]>>si[i][2];
	}
	dfs(1);
	if(!flag){
		puts("-1");
		return 0;
	}
	for(re int i=1;i<=n;++i){
        if(s[i]=='a'){
            if(f[i]>=f[i+n])cout<<"B";
            else cout<<"C";
        }
        if(s[i]=='b'){
            if(f[i]>=f[i+n])cout<<"A";
            else cout<<"C";
        }
        if(s[i]=='c'){
            if(f[i]>=f[i+n])cout<<"A"; 
            else cout<<"B";
        }
    }
}
2024/3/3 14:04
加载中...