题解:P13915 [PO Final 2024] 鬼抓人 / Tag
用一个 map 映射来维护每个人是否知道自己是猎人,无论他是不是被作弊者抓到的。
用
先输入。 然后把游戏开始时指定的猎人在映射中标记上。
每输入一个碰人事件:
- 判断这个人是否在数组中被标记,如果没有,把这个名字加入到
ans 里。 - 如果有,解除这个标记,因为他已经把猎人的身份传递出去了。
- 不管是不是,最后都要把被碰的那个人标记上,他是不知情的。
-
然后把
ans 数组排序,去重,输出。code
#include <bits/stdc++.h> using namespace std; map<string,bool> a; string name[100010]; string ans[100010]; int main(){ int n,m; cin>>n>>m; for(int i=0;i<n;i++){ cin>>name[i]; } a[name[0]]=1; int sum=0; for(int i=0;i<m;i++){ string s1,s2,s3; cin>>s1>>s2>>s3; if(a[s1]==0){ ans[sum++]=s1; } else{ a[s1]=0; } a[s3]=1; } sort(ans,ans+sum); sum=unique(ans,ans+sum)-ans; cout<<sum<<endl; for(int i=0;i<sum;i++){ cout<<ans[i]<<" "; } }