0pts求调
查看原帖
0pts求调
572587
cmrhhh楼主2024/7/5 13:08

不想换思路qwq,结尾附带样例,求调

#include<bits/stdc++.h>
using namespace std;
const int maxn=(5e4+10)*6;
vector<int>g[maxn];
stack<int>st;
bool instack[maxn];
int dfn[maxn],low[maxn],belong[maxn],cnt,scc;
void tarjan(int u){
	instack[u]=1;st.push(u);
	dfn[u]=low[u]=++cnt;
	for(int v:g[u]){
		if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
		else if(instack[v])low[u]=min(low[u],low[v]);
	}
	if(dfn[u]==low[u]){
		++scc;int x;
		do{
			x=st.top();st.pop();
			belong[x]=scc;
			instack[x]=0;
		}while(x!=u);
	}return ;
}
int n,d,l;
string s,s_;
int m,I[maxn],J[maxn];
char hi[maxn],hj[maxn];
bool flg=0;
#define AT(x) (x)
#define BT(x) (x+n)
#define CT(x) (x+2*n)
#define AF(x) (x+3*n)
#define BF(x) (x+4*n)
#define CF(x) (x+5*n)
int getT(int i,char hi){
	if(hi=='A')return AT(i);
	if(hi=='B')return BT(i);
	if(hi=='C')return CT(i);
}
int getF(int i,char hi){
	if(hi=='A')return AF(i);
	if(hi=='B')return BF(i);
	if(hi=='C')return CF(i);
}
void init(){
	for(int i=1;i<=n*6;++i)
		g[i].clear(),instack[i]=belong[i]=low[i]=dfn[i]=0;
	scc=cnt=0;
}
void solve(){
	init();
	for(int i=1;i<=m;++i){
		if(I[i]==J[i])continue;
		g[getT(I[i],hi[i])].push_back(getT(J[i],hj[i]));
		g[getF(J[i],hj[i])].push_back(getF(I[i],hi[i]));	
	}
	for(int i=0;i<l;++i){
		if(s_[i]=='a')g[BT(i)].push_back(CF(i)),g[CT(i)].push_back(BF(i)),g[BF(i)].push_back(CT(i)),g[CF(i)].push_back(BT(i));
		if(s_[i]=='b')g[AT(i)].push_back(CF(i)),g[CT(i)].push_back(AF(i)),g[AF(i)].push_back(CT(i)),g[CF(i)].push_back(AT(i));
		if(s_[i]=='c')g[BT(i)].push_back(AF(i)),g[AT(i)].push_back(BF(i)),g[BF(i)].push_back(AT(i)),g[AF(i)].push_back(BT(i));
	}
	for(int i=1;i<=6*n;++i)if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;++i)if(AT(i)==AF(i)||BT(i)==BF(i)||CF(i)==CT(i))return ;
	flg=1;
	for(int i=1;i<=n;++i){
		if(s_[i]=='a'){
			if(belong[BT(i)]<belong[CT(i)])cout<<'B';
			else cout<<'C';
		}
		if(s_[i]=='b'){
			if(belong[AT(i)]<belong[CT(i)])cout<<'A';
			else cout<<'C';
		}
		if(s_[i]=='c'){
			if(belong[AT(i)]<belong[BT(i)])cout<<'A';
			else cout<<'B';
		}
	}
	return ;
}
void dfs(int x){
	if(flg)return ;
	if(x>=l){solve();return;}
	while(x<l&&s[x]!='x')
		x++;
	for(int i=0;i<=1;++i)s_[x]=(i==0?'a':'b'),dfs(x+1);
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>d>>s>>m;
	for(int i=1;i<=m;++i)
		cin>>I[i]>>hi[i]>>J[i]>>hj[i];
	l=s.length();
	s_=s;
	dfs(0);
	if(!flg)cout<<-1;
	return 0;
}  
//假如一个x存在选c的方案,那么排除a和排除b都是可以跑出来的 
/*
2 0
ba
4
2 C 2 C
1 B 1 A
2 C 1 C
2 B 1 A
*///AB
2024/7/5 13:08
加载中...