蒋干

题目链接:https://ac.nowcoder.com/acm/contest/106859/G

题意:

给定总集合U,由若干个pair<string,string>构成
现拥有集合X:为集合U的子集
集合P:由若干个string构成
现要求X:1.为集合U的子集 2.不能只有一种元素
为此,可以从集合P中挑选一个string替换集合X中某一个元素的first

思路:

依旧分类讨论
1.如果集合X只有一种元素,只要在集合P中找到一个string和其second字符串组合后,是集合U的一个元素并且该string和其first字符串不同即可
2.如果集合X有多个元素,其实已经满足条件。但题目要求我们必须替换一个元素的first字符串
因此可以在集合P中找到与集合X的一个元素first字符串相同的string,替换
或者
在集合P中找到string与集合X的一个元素second字符串组成pair后,该pair存在于集合U中
(好像有概率会被hack,当只有在集合X只有两种元素时,但这样写是能通过的)

vector<string>cd;
set<pair<string,string>>dic;
set<pair<string,string>>st;
map<string,string>mp1;
map<string,string>mp2;
map<string,vector<string>>dic_mp;

void solve(){
	int n,m,k;cin>>n>>m>>k;
	rep(i,1,n){
		string a,b;cin>>a>>b;
		dic.insert({a,b});
		dic_mp[a].pb(b);
	}
	int cnt=0;
	rep(i,1,m){
		string a,b;cin>>a>>b;
		if(!st.count({a,b}))cnt++;
		st.insert({a,b});
		mp1[a]=b;
		mp2[b]=a;
	}
	rep(i,1,k){
		string s;cin>>s;
		cd.pb(s);
	}
	int ok=0;
	
	if(cnt==1){
		string front,behind;
		for(auto x:st){
			front=x.fi;
			behind=x.se;
		}
		
		for(int i=0;i<k;i++){
			string sk=cd[i];
			if(dic.count({sk,behind})&&sk!=front){
				cout<<"Yes"<<endl;
				cout<<front<<" "<<behind<<endl;
				cout<<sk<<" "<<behind<<endl;
				return;
			}	
		}
		cout<<"No"<<endl;
	}else{
		
		for(int i=0;i<k;i++){
			string sk=cd[i];
			if(mp1.count(sk)){
				cout<<"Yes"<<endl;
				cout<<sk<<" "<<mp1[sk]<<endl;
				cout<<sk<<" "<<mp1[sk]<<endl;
				return;
			}
			
			if(dic_mp.count(sk)){
				for(int j=0;j<dic_mp[sk].size();j++){
					string be=dic_mp[sk][j];
					if(mp2.count(be)){
						cout<<"Yes"<<endl;
						cout<<mp2[be]<<' '<<be<<endl;
						cout<<sk<<' '<<be<<endl;
						return;
					}
				}
			}
		}
		cout<<"No"<<endl;
	}
}
posted @ 2025-04-14 19:51  Marinaco  阅读(12)  评论(0)    收藏  举报
//雪花飘落效果