CCF 201612-3 权限查询
来源:互联网 发布:专用抢红包软件 编辑:程序博客网 时间:2024/05/16 06:17
虽然写的时候觉得很烦,但竟然一次性过了。这道题主要是在决定用什么方式存储每种角色所拥有的权限和每个用户所拥有的角色上比较纠结,由于题目明确表示后面所有权限都只会在P段中出现,所以P段数据对这道题其实是可有可无的,直接用getline处理掉即可。本来打算用结构体,将每个角色的所有权限都作为一个角色的所有属性,对每个用户的所有角色也同样处理,但觉得这样每次找对应的权限都要循环遍历,比较麻烦,最终使用了嵌套的map。使用map<string,vector<Privilege> >实现角色到权限的映射(后来觉得用map<string, map<string,int> >好像更好,但懒得改了),使用map<string,map<string, int> >实现用户名到权限的映射,第二个本来是想通过用户名到角色的映射的,但注意到查询操作中,只需要通过用户名查找权限,因此可以直接把角色信息忽略。在使用string的find函数时要注意找不到时是返回string::npos(虽然知道,但做题时还是可能一不小心以为返回值是true和false),还有一个就是,**引用真的超好用的**,好多地方都通过引用简化代码,但对于结构体中含有指针或数组时使用引用有时会出错,不知道为什么。
#include<iostream>#include<algorithm>#include<map>#include<string>#include<vector>using namespace std;const int max_pru = 100;struct Privilege{ string privilege_name; int level; Privilege(string p, int l):privilege_name(p),level(l){} };map<string,vector<Privilege> > r_t_p;map<string,map<string, int> > u_t_p;void show_r_t_p(){ map<string, vector<Privilege> >::iterator mit; for(mit = r_t_p.begin(); mit != r_t_p.end(); mit++) { cout << mit->first << "---> "; vector<Privilege> &v = mit->second; for(int i = 0; i < v.size(); i++) { cout << v[i].privilege_name << ":" << v[i].level << " "; } cout << endl; }}void show_u_t_p(){ map<string, map<string, int> >::iterator it1; for(it1=u_t_p.begin(); it1!=u_t_p.end(); it1++) { cout << it1->first << "----> "; map<string, int>& m = it1->second; map<string, int>::iterator it2; for(it2=m.begin(); it2!=m.end(); it2++) { cout << it2->first << ":" << it2->second << " "; } cout << endl; } }int main(){ int p; cin >> p; getchar(); for(int i = 0; i < p; i++) { string priv; getline(cin, priv); } int r; cin >> r; for(int i = 0; i < r; i++) { string role; string priv; int p_num; cin >> role >> p_num; for(int j = 0; j < p_num; j++) { cin >> priv; if(priv.find(":")==string::npos) { r_t_p[role].push_back(Privilege(priv, -1)); }else { string pre_priv = priv.substr(0, priv.length()-2); int level = priv[priv.length()-1]-'0'; r_t_p[role].push_back(Privilege(pre_priv, level)); } } }//for(i)// show_r_t_p(); int u; cin >> u; for(int i = 0; i < u; i++) { string user; int r_n; cin >> user >> r_n; for(int j = 0; j < r_n; j++) { string role; cin >> role; vector<Privilege> &v = r_t_p[role]; for(int k = 0; k < v.size(); k++) { map<string, int> &m = u_t_p[user]; if(m.count(v[k].privilege_name)) { int one = v[k].level; int second = m[v[k].privilege_name]; m[v[k].privilege_name]= max(one, second); }else { m[v[k].privilege_name] = v[k].level; } } } }// show_u_t_p(); int q; cin >> q; for(int i = 0; i < q; i++) { string user; cin >> user; string priv; cin >> priv; if(!u_t_p.count(user)) cout << "false\n"; else { map<string, int> &m = u_t_p[user];// if(priv.find(":")!=string::npos) if(priv[priv.length()-2]==':') {// cout << "**** " << priv << "找到:\n"; string pre_priv = priv.substr(0, priv.length()-2); int level = priv[priv.length()-1]-'0'; if(!m.count(pre_priv)) cout << "false\n"; else { if(level<=m[pre_priv]) cout << "true\n"; else cout << "false\n"; } }else {// cout << "*******user = " << user << " " << "priv = " << priv << endl; if(!m.count(priv)) cout << "false\n"; else { if(m[priv]==-1) cout << "true\n"; else { cout << m[priv] << "\n"; } } } } }}
阅读全文
0 0
- CCF 201612-3 权限查询
- ccf 201612-3 权限查询
- CCF 201612-3 权限查询
- 201612-3 权限查询 ccf
- CCF认证 201612-3 权限查询
- [CCF-CSP]201612-3(权限查询)
- CCF-CSP 权限查询 JAVA 201612-3
- CCF 201612-3 权限查询 【模拟+STL】
- CCF CSP试题 201612-3 权限查询
- CCF CSP 权限查询 JAVA 201612-3
- 【CCF】201612_3权限查询
- CCF认证考试201612-3 权限查询题解
- CCF CSP 201612-3 权限查询(Java-100分)
- CCF 201612-3 权限查询 (90分,提示运行错误)
- CCF 201612-03 权限查询 题解
- CCF权限查询
- ccf试题 权限查询
- CCF权限查询
- P2822 组合数问题
- 接口调用方式
- EasyNVR RTSP转RTMP/HLS流媒体服务器前端构建之:bootstrap弹窗功能的实现
- 大学作品
- 2017年数学建模大赛A题剖析(第一问求解间距思路分析)
- CCF 201612-3 权限查询
- Material Design: RecyclerView配合CardView创建卡片列表
- Chrome浏览器扩展
- python3.5安装pycrypto的问题
- python数据分析入门
- Java学习之旅
- Matlab Newton向后插值
- leetcode题解-436. Find Right Interval
- vue构建的七彩外衣