2021 RoboCom CAIP本科组决赛-7-3 账户安全预警

1.题目

题目链接:7-3 账户安全预警 - 2021 RoboCom 世界机器人开发者大赛-本科组(决赛) (pintia.cn)

2. 题解

//ip登录次数+总登录次数
//输出:
//邮箱:ip的种类从大到小,相同的话,邮箱的字典序输出
//ip:   ip次数从大到小输出。一致的话,字典序 
#include<bits/stdc++.h>
using namespace std;
struct node{ 
  	string ip;     //ip 
	int times;     //次数   
};
struct node1{
	string email;
	int kind;  //ip种类数 
};
vector<node1> res;  //存储结果邮箱 
map<string,vector<node> > p;  //邮箱和 ip+次数 
map<string,int> m;  //邮箱+总登录次数
map<string,int> k;  //邮箱+ip种类数 
map<string,set<string> > mp;  //邮箱,登录ip 
map<pair<string,string>,int> mt;  //邮箱+ip 次数
int n,t1,t2;
//按照邮箱ip种类从大到小,相同的话按照邮箱字典序 
bool cmp1(node1 x,node1 y){
	if(x.kind!=y.kind)
		return x.kind>y.kind; 
	return x.email<y.email; 
}
//按照ip次数从大到小,否则按照字典序 
bool cmp(node x,node y){
	if(x.times!=y.times)
		return x.times>y.times;
	return x.ip<y.ip; 
}
//判断邮箱st是否是预警账号 
bool judge(string st){
	if(k[st]>t1&&m[st]>t2)
		return true;
	return false; 
} 
int main(void){
	cin>>n>>t1>>t2;
	for(int i=1;i<=n;i++){
		string a,b;
		cin>>a>>b;
		mp[a].insert(b);
		m[a]++;
		mt[{a,b}]++; 
	}
	for(auto x:mp){
		k[x.first]=x.second.size();
	}
	for(auto x:mp){
		string i=x.first;
		set<string> j=x.second;
		if(judge(i)){
			res.push_back({i,k[i]});
			//存入p中
			for(auto z:j){
				p[i].push_back({z,mt[{i,z}]});
			} 
		}
	}
	if(!res.empty()){
		sort(res.begin(),res.end(),cmp1);
		for(auto& x:p){  //必须加&,使得排序结果存回到p映射 
  			vector<node>& z=x.second;
			sort(z.begin(),z.end(),cmp);
		}
		for(int i=0;i<res.size();i++){
			if(i!=0) cout<<endl;
			cout<<res[i].email;
			vector<node> z=p[res[i].email];
			for(int j=0;j<z.size();j++){
				cout<<endl<<z[j].ip<<" "<<z[j].times;
			}
		}
	}else{  //所有ip的数量最多的一批账户信息
		int maxi=0;
		for(auto x:k){
			maxi=max(x.second,maxi);
		}
		for(auto x:k){
			if(x.second==maxi){
				set<string> s=mp[x.first];
				for(auto i:s){
					p[x.first].push_back({i,mt[{x.first,i}]});
				}
			}
		}
		for(auto x:p){
			vector<node> z=x.second;
			sort(z.begin(),z.end(),cmp);
			cout<<x.first<<endl;
			for(int j=0;j<z.size();j++){
				cout<<z[j].ip<<" "<<z[j].times<<endl;
			}
		}	
	} 
	return 0;
}

我做的方法虽然能通过所有样例点,但是感觉选择存储的数据结构并不好,过于繁琐,等我后面看看有没有什么优化数据结构再来改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值