不想换思路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)),g[CT(i)].push_back(AF(i)),g[BT(i)].push_back(AF(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)),g[CT(i)].push_back(BF(i)),g[AT(i)].push_back(BF(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)),g[AT(i)].push_back(CF(i)),g[BT(i)].push_back(CF(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)||AT(i)==BT(i)||AT(i)==CT(i)||BT(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