题解 | #代理服务器#
代理服务器
http://www.nowcoder.com/practice/1284469ee94a4762848816a42281a9e0
#include <cstdio>
#include <iostream>
#include <string>
#include <map>
using namespace std;
//“每一步走尽量远”的贪心思路是没错的,虚心学习他人做法,汲取那个“标记”的思路。
//每次切走时有一个关键细节,详见该处注释
map<string, bool> agent;
int main(){
int n,m;
while(scanf("%d",&n) != EOF){
string s;
for(int i=0; i<n; i++){
cin >> s;
agent.insert(pair<string, bool>(s, false));
}
int cnt = 0;//当前agent中已被标记的个数
int ans = 0;//切换次数
scanf("%d",&m);
int bk = 0;//里层break标识
for(int i=0; i<m; i++){
cin >> s;
if(agent.count(s)){//有对应的代理
if(n == 1){//无解情况的处理
printf("-1\n");
bk = 1;
i++;
while(i<m){
cin>>s; i++;
}
break;
}
if(agent[s] == false){//没标记过则标记
cnt++;
agent[s] = true;
}
}
if(cnt == n){//已全都标记过,则执行切换 切换的目标待定 (刚才这一轮应该用哪个来扫,也是此时才确定的)
//注意一个关键细节:由于是“切走”,所以切之前的那个直接置为true
cnt = 1;
ans++;
for(map<string,bool>::iterator iter = agent.begin(); iter!=agent.end(); iter++){//学习使用迭代器
if(iter->first != s){
iter->second = false;//全部重置为未标记状态
}
}
}
}
if(bk){
continue;
agent.clear();
}
printf("%d\n",ans);
agent.clear();
}
return 0;
}