极限卡时
查看原帖
极限卡时
939957
wanjiabao楼主2024/11/25 21:26

AC代码,hack数据第一个点跑1.99s。

#include<bits/stdc++.h> 
using namespace std;
int n,d,m,id,scc[100005];
char ans[50005],ns[50005];
char yu[5][5]={"BC","AC","AB"};
string s;
struct node{
	int i,j;
	char hi[5],hj[5];
};
bool vis[100005];
node vec[100005];
vector<int>plc,g[100005],g2[100005];
vector<int>sk;
void dfs1(int u){
    vis[u]=1;
    for(auto v:g[u]){
        if(!vis[v])dfs1(v);
    }
    sk.push_back(u);
}//第一遍dfs
void dfs2(int u){
    scc[u]=id;
    for(auto v:g2[u]){
        if(!scc[v])dfs2(v);
    }
}//建反图跑第二遍dfs
//kosarajo
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>d>>s>>m;
	s=' '+s;
	for(int i=1;i<=n;i++){
		if(s[i]=='x')plc.push_back(i);
		else ns[i]=s[i];
	}
	for(int i=1;i<=m;i++){
		cin>>vec[i].i>>vec[i].hi>>vec[i].j>>vec[i].hj;
	}
	for(int msk=0;msk<(1<<d);msk++){
		fill(vis+1,vis+1+2*n,0);
		fill(scc+1,scc+1+2*n,0);
		sk.clear();
		id=0;
		for(int i=1;i<=2*n;i++)g[i].clear(),g2[i].clear();
		for(int i=0;i<d;i++){
			if(msk&(1<<i))ns[plc[i]]='a';
			else ns[plc[i]]='b';
		}
		for(int x=1;x<=m;x++){
   			int i=vec[x].i,j=vec[x].j;
   			int vi=ns[i]-'a',vj=ns[j]-'a';
   			int u1=i+n*(vec[x].hi[0]!=yu[vi][0]),v1=j+n*(vec[x].hj[0]!=yu[vj][0]);
   			int u2=(u1>n?u1-n:u1+n),v2=(v1>n?v1-n:v1+n);
   			if(vec[x].hi[0]-'A'==vi)continue;
   			if(vec[x].hj[0]-'A'==vj){
   				g[u1].push_back(u2);
   				g2[u2].push_back(u1);
			}else{
    			g[u1].push_back(v1);
    			g2[v1].push_back(u1);
    			g[v2].push_back(u2);
    			g2[u2].push_back(v2);
   			}
  		}//毒瘤建图
  		for(int i=1;i<=2*n;i++){
        	if(!vis[i])dfs1(i);
    	}
    	for(int i=sk.size()-1;i>=0;i--){
        	int v=sk[i];
        	if(!scc[v]){
         	    id++;
         	    dfs2(v);
        	}
    	}
    	bool flag=1;
    	for(int i=1;i<=n;i++){
    		if(scc[i]==scc[i+n]){
    			flag=0;
    			break;
			}
		}
    	if(flag){
   			for(int i=1;i<=n;i++){
   				if(scc[i]>scc[i+n]){
     				if(ns[i]=='a')cout<<'B';
     				else cout<<'A';
    			}
    			else{
     				if(ns[i]!='c')cout<<'C';
     				else cout<<'B';
    			}
			}
			return 0;
  		}
	}
	cout<<-1;
}

鉴于这道题太恶心了我C遍了TJ也找不到一个用kosarajo的,仅供参考

2024/11/25 21:26
加载中...