5pts求条
查看原帖
5pts求条
1058570
tzhengqing楼主2025/7/22 08:46

rt.

#include<bits/stdc++.h>
using namespace std;
const int N=2000005;
int n,m,d,dfn[N],low[N],vis[N],cnt=0,scc[N],topo[N],x[N],y[N],a[N],b[N],sc=0;
string s;
vector<int>e[N];
stack<int>st;
void tarjan(int f,int x)
	{
	dfn[x]=low[x]=++cnt;vis[x]=1;st.push(x);
	for(int i=0;i<e[x].size();i++)
		{
		int d=e[x][i];
		if(!dfn[d])
			{
			tarjan(x,d);
			low[x]=min(low[x],low[d]);
			}
		else if(vis[d])low[x]=min(low[x],dfn[d]);
		}
	if(dfn[x]==low[x])
		{
		while(st.top()!=x)
			{
			int d=st.top();
			scc[d]=x;vis[d]=0;
			st.pop();
			}
		scc[x]=x;topo[x]=++sc;vis[x]=0;st.pop();
		}
	}
void work()
	{
	memset(dfn,0,sizeof dfn);
	memset(low,0,sizeof low);
	memset(scc,0,sizeof scc);
	for(int i=1;i<=n;i++)e[i].clear();
	for(int i=1;i<=m;i++)
		{
		int d=s[x[i]-1]-'a';
		if(a[i]==d)continue;
		int f=s[y[i]-1]-'a';
		if(b[i]==f)e[x[i]].push_back(x[i]+n);
		else e[x[i]].push_back(y[i]),e[y[i]+n].push_back(x[i]+n);
		}
	for(int i=1;i<=n*2;i++)
		{
		if(!dfn[i])tarjan(0,i);
		}
	for(int i=1;i<=n;i++)
		{
		int a1=scc[i],a2=scc[i+n];
		if(a1==a2)return;
		}
	for(int i=1;i<=n;i++)
		{
		int d=s[i-1]-'a';
		cout<<(topo[scc[i]]<topo[scc[i+n]]?(d==0?'B':'A'):(d==2?'B':'C'));
		}
	exit(0);
	}
void dfs(int v)
	{
	if(v==n+1){work();return;}
	if(s[v-1]!='x')dfs(v+1);
	else 
		{
		s[v-1]='a';dfs(v+1);
		s[v-1]='b';dfs(v+1);
		}
	}
int main()
	{
	cin>>n>>d>>s>>m;
	for(int i=1;i<=m;i++)
		{
		int xx,aa,yy,bb;char a1,b1;cin>>xx>>a1>>yy>>b1;
		aa=a1-'A';bb=b1-'A';
		x[i]=xx;y[i]=yy;a[i]=aa;b[i]=bb;
		}
	dfs(1);
	cout<<-1;
	return 0;
	}
2025/7/22 08:46
加载中...