• 角色授权 CSP 202206-3


    题目太长我就不截图了,昨天晚上写了这道题,写了100行,只给了20分,不得不说,总感觉自己能拿到满分,但就是不知道哪里错了,改了一会儿,依然是20.后来,找了一个答案,不得不说写的太好了,很清楚,大概大佬就是如此吧,同样100行,我20大佬100,看了大佬代码后,有很多收获,所以在此记录一下。

    1.代码逻辑有问题

    其中有个功能要求实现判断某个用户,能不能做某个操作,我的逻辑和题正好相反,虽然它没错,但是浪费了时间,最主要是和题意相反。多做了一些无意义的事情。

    2.事无巨细,全结构体

    我第一次做这种大模拟题,生怕有的信息会漏掉,就用了很多结构体,无形之中就复杂了这个过程,虽然有c++的stl帮忙,但还是结果不尽人意,所以说,这种题还得练练,把思路和逻辑想清楚,才能更快更好的做出这些问题。

    附代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N = 510;
    6. int n, m, q; //角色数量,角色关联数量,待检测操作数量
    7. struct Role { //character
    8. string name;
    9. int nv, no, nn;//操作集合 资源种类集合 资源名称集合
    10. unordered_mapint> op;
    11. unordered_mapint> type;
    12. unordered_mapint> source;
    13. }role[N];
    14. unordered_mapint> roletoid;
    15. unordered_mapint> > usertoid;
    16. unordered_mapint> > grouptoid;
    17. bool check(int id, string o, string t, string s)
    18. {
    19. if (role[id].op.count(o) == 0 && role[id].op.count("*") == 0) return false;
    20. if (role[id].type.count(t) == 0 && role[id].type.count("*") == 0) return false;
    21. if (role[id].source.count(s) == 0 && role[id].nn != 0) return false;
    22. return true;
    23. }
    24. int main()
    25. {
    26. cin >> n >> m >> q;
    27. for (int i = 0; i < n; i++) //输入每个角色的信息
    28. {
    29. cin >> role[i].name;
    30. roletoid[role[i].name] = i;
    31. string t; int m;
    32. cin >> m;
    33. for (int j = 0; j < m; j++)
    34. {
    35. cin >> t;
    36. role[i].op[t] = 1;
    37. }
    38. cin >> m;
    39. for (int j = 0; j < m; j++)
    40. {
    41. cin >> t;
    42. role[i].type[t] = 1;
    43. }
    44. cin >> role[i].nn;
    45. for (int j = 0; j < role[i].nn; j++)
    46. {
    47. cin >> t;
    48. role[i].source[t] = 1;
    49. }
    50. }
    51. for (int i = 0; i < m; i++) //输入每个角色关联的信息
    52. {
    53. string s; cin >> s; //角色名称
    54. int id = roletoid[s];
    55. int m; cin >> m;
    56. for (int j = 0; j < m; j++)
    57. {
    58. char t; cin >> t;
    59. string name; cin >> name;
    60. if (t == 'u')
    61. usertoid[name].push_back(id);
    62. else
    63. grouptoid[name].push_back(id);
    64. }
    65. }
    66. for (int i = 0; i < q; i++)
    67. {
    68. string un; cin >> un; //用户名称
    69. int ng; cin >> ng;
    70. string ugroup[N];
    71. for (int j = 0; j < ng; j++) cin >> ugroup[j];
    72. string op, type, source;
    73. cin >> op >> type >> source;
    74. bool flag = false;
    75. for (int id : usertoid[un])
    76. if (check(id, op, type, source))
    77. flag = true;
    78. if (!flag)
    79. {
    80. for (int j = 0; j < ng; j++)
    81. for (int id : grouptoid[ugroup[j]])
    82. if (check(id, op, type, source))
    83. flag = true;
    84. }
    85. if (flag) cout << 1 << endl;
    86. else cout << 0 << endl;
    87. }
    88. return 0;
    89. }

    第26届CSP第三题角色授权-pudn.com

  • 相关阅读:
    python安全脚本开发简单思路
    【Java】迭代器的next方法
    java-net-php-python-jspm服务器密码管理系统计算机毕业设计程序
    使用C语言,编写猜数字小游戏(使用时间戳)
    JavaScript基础
    【并发】深入理解Java线程的底层原理
    MacBook电脑垃圾清理软件CleanMyMac X4.18
    小白必知必会的几个IP协议知识
    辅助驾驶功能开发-功能对标篇(5)-NDA领航辅助系统-广汽埃安
    阿里开源数据同步神器DataX异构数据源间数据同步同步MySQL与HDFS相互实战
  • 原文地址:https://blog.csdn.net/qq_59183443/article/details/126647180