蒋干
题目链接: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;
}
}

浙公网安备 33010602011771号