当前位置: 首页 > news >正文

CCF-CSP 26次 第三题【角色授权】

计算机软件能力认证考试系统

20分:

#include<bits/stdc++.h>
using namespace std;
const int N=440;
int n,m,q,nv,no,nn,ns,ng;
struct Node
{string name;map<string,int>op;map<string,int>res_kind;map<string,int>res_name;
}role[N];
map<string,string>mp;
int main()
{scanf("%d %d %d",&n,&m,&q);for(int i=0;i<n;i++){cin>>role[i].name;scanf("%d",&nv);while(nv--){string s;cin>>s;}scanf("%d",&no);while(no--){string s;cin>>s;}scanf("%d",&nn);while(nn--){string s;cin>>s;}}string s1,s2,s3;for(int i=0;i<m;i++){cin>>s1>>ns>>s2>>s3;}for(int i=0; i<q; i++){string s,str1,str2,str3;cin>>s>>ng;string ss;cin>>ss;cin>>str1>>str2>>str3;if(s2=="u"){if(s3==s)printf("1\n");elseprintf("0\n");}else if(s2=="g"){if(s3==ss)printf("1\n");elseprintf("0\n");}}return 0;
}

100分:

需要注意提速之后,scanf与cin不能同时用

#include<iostream>
#include<vector>
#include<set>
#include<unordered_map>
using namespace std;
#pragma GCC optimize(2)struct User{string name;set<string> op;set<string> cat;set<string> list;
};
// 记录某些用户或组关联了哪些角色
// 实际上组和用户没必要区分,统一看作用户
unordered_map<string, vector<int>> to_users;int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);//提速,cin与scnaf不能同时用int n, m, q;cin >> n >> m >> q;vector<User> users(n);// Usersstring tmp;for(int i = 0; i < n; i ++){cin >> tmp;users[i].name = tmp;int nv, no, nn;// operationscin >> nv;while(nv--){cin >> tmp;users[i].op.insert(tmp);}// categorycin >> no;while(no--){cin >> tmp;users[i].cat.insert(tmp);}// listcin >> nn;while(nn--){cin >> tmp;users[i].list.insert(tmp);}}// 将用户或组绑定已有的角色while(m--){// cin >> tmp;int idx = -1;for(int i = 0; i < users.size(); i ++){if(users[i].name == tmp){idx = i;break;}}int ns;cin >> ns;string t1, t2;while(ns--){cin >> t1 >> t2;// push_back的是角色在users数组中的下标// 把用户和组都看做成用户,不区分身份,因此t1没用to_users[t2].push_back(idx);}}while(q--){cin >> tmp;int ng;cin >> ng;vector<string> group;// 加入关联的用户组(包含自己以及关联的用户和组)group.push_back(tmp);while(ng--) {cin >> tmp;group.push_back(tmp);}// check tmp1 tmp2 tmp3string tmp1, tmp2, tmp3;cin >> tmp1 >> tmp2 >> tmp3;bool flag1 = false, flag2 = flag1, flag3 = flag1;// 之后就是看组中这些用户关联的角色们是否有权限了// 满足一个就break,否则就重置三个flagfor(int i = 0; i < group.size(); i ++){int n = to_users[group[i]].size();for(int j = 0; j < n; j ++){if(users[to_users[group[i]][j]].op.count(tmp1) || users[to_users[group[i]][j]].op.count("*")) flag1 = true;if(users[to_users[group[i]][j]].cat.count(tmp2) || users[to_users[group[i]][j]].cat.count("*")) flag2 = true;if(users[to_users[group[i]][j]].list.size() == 0) flag3 = true;else{if(users[to_users[group[i]][j]].list.count(tmp3))flag3 = true;}if(flag1 && flag2 && flag3) break;else{flag1 = false;flag2 = flag1;flag3 = flag1;}}if(flag1 && flag2 && flag3) break;}if(flag1 && flag2 && flag3) cout << 1 << endl;else cout << 0 << endl;}
}

http://www.lryc.cn/news/152450.html

相关文章:

  • Ansible学习笔记11
  • Vue中如何为Echarts统计图设置数据
  • 力扣141. 环形链表
  • 4.1 链式栈StackT
  • 算法练习(10):牛客在线编程10 贪心算法
  • Java8新特性1——函数式接口lambda表达式
  • 文本标注技术方案(NLP标注工具)
  • 03-使用一个不可变对象作为key,红黑树怎么比较大小?
  • 2021江苏省赛热身赛 C Magic Rabbit(数形结合)
  • AES加密(2):AES代码实现解析
  • SpringBoot项目通过分词器生成词云
  • Nacos 配置管理及相关使用
  • 重发布与路由策略
  • 57. 插入区间(C++题解)
  • 【数据结构Java版】 初识泛型和包装类
  • Spring中如何解决循环依赖问题的三种方法
  • 【ArcGIS Pro二次开发】(65):进出平衡SHP转TXT、TXT转SHP
  • Shell开发实践:服务器的磁盘、CPU、内存的占用监控
  • 超详细 async和await 项目实战运用(附加文字解答+源码)
  • Maven入门教程(三):Maven语法
  • C++技术点,故事解析
  • 数据结构(Java实现)-字符串常量池与通配符
  • python强化学习--gym安装与使用
  • 105. 从前序与中序遍历序列构造二叉树
  • (第六天)初识Spring框架-SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录
  • 如何使用『Nginx』配置后端『HTTPS』协议访问
  • Git仓库简介
  • TensorRTC++ | INT8量化
  • VS + qt环境使用QCustomPlot等三方库如何配置
  • OS 段页结合的实际内存管理