• [模拟][stl]账户安全预警 2021RoboCom决赛C


    拼题 A 系统为提高用户账户的安全性,打算开发一个自动安全预警的功能。对每个账户的每次登录,系统会记录其登录的 IP 地址。每隔一段时间,系统将统计每个账户从多少不同的 IP 地址分别登录了多少次。如果某个账户的登录 IP 超过了 TIP​ 种,并且登录过于频繁,超过了 Tlogin​ 次,则会自动向管理员发出警报。

    下面就请你实现这个预警功能。

    输入格式:

    输入首先在第一行中给出三个正整数:N(≤104)为登录记录的条数;TIP​ 和
    Tlogin​,定义如题面中所描述,均不超过 100。

    随后 N 行,每行格式为:

    账户邮箱 IP地址
    

    其中 账户邮箱 为长度不超过 40 的、不包含空格的非空字符串;IP地址 为形如 xxx.xxx.xxx.xxx 的合法 IP 地址。

    输出格式:

    按照登录所用不同 IP 的数量的非递增顺序,输出每个预警账户的信息。格式为:

    1. 账户邮箱
    2. IP1 登录次数
    3. IP2 登录次数
    4. ……

    其中 IP 按登录次数的非递增顺序输出,如有并列,则按 IP 的递增字典序输出。此外,对所用不同 IP 的数量并列的用户,按其账户邮箱的递增字典序输出。

    另一方面,即使没有账户达到预警线,也输出登录所用不同 IP 的数量最多的一批账户的信息。

    输入样例 1:

    1. 24 3 4
    2. daohaole@qq.com 218.109.231.189
    3. 1jiadelaolao@163.com 112.192.203.187
    4. chenyuelaolao@zju.edu.cn 112.18.235.143
    5. jiadelaolao@163.com 112.192.203.187
    6. chenyuelaolao@zju.edu.cn 113.18.235.143
    7. jiadelaolao@163.com 111.192.203.187
    8. daohaole@qq.com 218.109.231.189
    9. chenyuelaolao@zju.edu.cn 111.18.235.143
    10. 1jiadelaolao@163.com 115.192.203.187
    11. daohaole@qq.com 113.189.58.141
    12. 1jiadelaolao@163.com 111.192.203.187
    13. daohaole@qq.com 112.18.58.145
    14. 1jiadelaolao@163.com 114.192.203.187
    15. chenyuelaolao@zju.edu.cn 112.18.235.143
    16. daohaole@qq.com 123.89.158.214
    17. chenyuelaolao@zju.edu.cn 112.18.235.143
    18. youdaohaole@qq.com 218.109.231.189
    19. jiadelaolao@163.com 113.192.203.187
    20. youdaohaole@qq.com 218.109.231.189
    21. jiadelaolao@163.com 114.192.203.187
    22. youdaohaole@qq.com 113.189.58.141
    23. youdaohaole@qq.com 123.89.158.214
    24. 1jiadelaolao@163.com 113.192.203.187
    25. youdaohaole@qq.com 112.18.58.145

    输出样例 1:

    1. 1jiadelaolao@163.com
    2. 111.192.203.187 1
    3. 112.192.203.187 1
    4. 113.192.203.187 1
    5. 114.192.203.187 1
    6. 115.192.203.187 1
    7. daohaole@qq.com
    8. 218.109.231.189 2
    9. 112.18.58.145 1
    10. 113.189.58.141 1
    11. 123.89.158.214 1
    12. youdaohaole@qq.com
    13. 218.109.231.189 2
    14. 112.18.58.145 1
    15. 113.189.58.141 1
    16. 123.89.158.214 1

    输入样例 2:

    1. 24 5 8
    2. daohaole@qq.com 218.109.231.189
    3. 1jiadelaolao@163.com 112.192.203.187
    4. chenyuelaolao@zju.edu.cn 112.18.235.143
    5. jiadelaolao@163.com 112.192.203.187
    6. chenyuelaolao@zju.edu.cn 113.18.235.143
    7. jiadelaolao@163.com 111.192.203.187
    8. daohaole@qq.com 218.109.231.189
    9. chenyuelaolao@zju.edu.cn 111.18.235.143
    10. 1jiadelaolao@163.com 115.192.203.187
    11. daohaole@qq.com 113.189.58.141
    12. 1jiadelaolao@163.com 111.192.203.187
    13. daohaole@qq.com 112.18.58.145
    14. 1jiadelaolao@163.com 114.192.203.187
    15. chenyuelaolao@zju.edu.cn 112.18.235.143
    16. daohaole@qq.com 123.89.158.214
    17. chenyuelaolao@zju.edu.cn 112.18.235.143
    18. youdaohaole@qq.com 218.109.231.189
    19. jiadelaolao@163.com 113.192.203.187
    20. youdaohaole@qq.com 218.109.231.189
    21. jiadelaolao@163.com 114.192.203.187
    22. youdaohaole@qq.com 113.189.58.141
    23. youdaohaole@qq.com 123.89.158.214
    24. 1jiadelaolao@163.com 113.192.203.187
    25. youdaohaole@qq.com 112.18.58.145

    输出样例 2:

    1. 1jiadelaolao@163.com
    2. 111.192.203.187 1
    3. 112.192.203.187 1
    4. 113.192.203.187 1
    5. 114.192.203.187 1
    6. 115.192.203.187 1

    题意: 给出n条登录记录,每个记录由登录邮箱和登录ip组成,同时给出两参数k1和k2,当某邮箱登录次数超过k1且不同登录ip超过k2就将该登录邮箱标记为预警账户,按照题目要求输出所有预警账户,每个预警账户还要输出各登录ip及其出现次数,如果不存在预警账户,那么就输出不同ip最多的那批账户信息。

    分析: 其实就是一个比较复杂的模拟题,如果借助stl来实现就会比较容易,首先用一个map>保存下来每个邮箱的全部登录ip,之后遍历该map,对于每一个邮箱的登录ip进行合并,这里可以再开一个map>>,其中vector>就保存了该邮箱不同种类的ip以及其出现次数,最后按照题目要求分别对邮箱和相应ip进行排序即可。

    具体代码如下: 

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. using namespace std;
    11. unordered_map> mp;
    12. unordered_mapint>>> mp2;
    13. bool cmp(string x, string y){
    14. if(mp2[x].size() != mp2[y].size())
    15. return mp2[x].size() > mp2[y].size();
    16. return x < y;
    17. }
    18. bool cmp2(pairint> x, pairint> y){
    19. if(x.second != y.second)
    20. return x.second > y.second;
    21. return x.first < y.first;
    22. }
    23. signed main()
    24. {
    25. ios::sync_with_stdio(0);
    26. cin.tie(0);
    27. int n, k1, k2;
    28. cin >> n >> k1 >> k2;
    29. for(int i = 1; i <= n; i++){
    30. string s1, s2;
    31. cin >> s1 >> s2;
    32. mp[s1].push_back(s2);
    33. }
    34. vector res;
    35. for(unordered_map>::iterator it = mp.begin(); it != mp.end(); it++){
    36. unordered_mapint> a;
    37. for(int i = 0; i < (it->second).size(); i++){
    38. string s = (it->second)[i];
    39. a[s]++;
    40. }
    41. for(unordered_mapint>::iterator i = a.begin(); i != a.end(); i++)
    42. mp2[it->first].push_back(make_pair(i->first, a[i->first]));
    43. if(a.size() > k1 && (it->second).size() > k2)
    44. res.push_back(it->first);
    45. }
    46. sort(res.begin(), res.end(), cmp);
    47. for(int i = 0; i < res.size(); i++){
    48. cout << res[i] << endl;
    49. vectorint>> ip = mp2[res[i]];
    50. sort(ip.begin(), ip.end(), cmp2);
    51. for(int j = 0; j < ip.size(); j++)
    52. cout << ip[j].first << " " << ip[j].second << endl;
    53. }
    54. if(res.size() == 0){
    55. int mx = 0;
    56. for(unordered_mapint>>>::iterator it = mp2.begin(); it != mp2.end(); it++){
    57. mx = max(mx, (int)(it->second).size());
    58. }
    59. for(unordered_mapint>>>::iterator it = mp2.begin(); it != mp2.end(); it++){
    60. if((it->second).size() == mx)
    61. res.push_back(it->first);
    62. }
    63. sort(res.begin(), res.end(), cmp);
    64. for(int i = 0; i < res.size(); i++){
    65. cout << res[i] << endl;
    66. vectorint>> ip = mp2[res[i]];
    67. sort(ip.begin(), ip.end(), cmp2);
    68. for(int j = 0; j < ip.size(); j++)
    69. cout << ip[j].first << " " << ip[j].second << endl;
    70. }
    71. }
    72. return 0;
    73. }

  • 相关阅读:
    数据库概论 - MySQL的简单介绍
    CPU核心数和线程数都是什么意思
    vue2 使用vue-org-tree 组件完整简单示例Demo vue2-org-tree
    2023-11-Rust
    (十)centos7案例实战——实现nginx代理访问redis服务
    【牛客网面试必刷TOP101】二叉树篇(三)
    11款新编程工具!
    ZZNUOJ_C语言1044:不及格率(完整代码)
    008:字符串交换,输入两个长度为4的字符串,交换这两个字符串的前两个字符后输出
    【重新定义matlab强大系列十六】求解混合整数线性问题
  • 原文地址:https://blog.csdn.net/m0_55982600/article/details/126215587