CCF-权限查询-201612-3
Posted xidian-mao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF-权限查询-201612-3相关的知识,希望对你有一定的参考价值。
这道题,开始只有10分.....原因是将false 写成了 flase
我要吐血而亡....关键是还debug了半天,以为是逻辑错了
不过亮点是代码很简洁,网上140+的代码看着真复杂
核心:
做题之前首先要理好思路,读清楚题意,不要担心在写代码上浪费时间.思路清晰写起来很快的
首先设计好数据结构,然后设计一个权限类型的输入函数,将三种判别方法发合并,总结出简洁的方式判断
首先去无权限的默认权限是0;
查询的时候查询的是最高权限,初始-1
如果查到了权限小于要求的权限(要求的权限没有也默认为0) 就是no
否则再判断是否是有等级的无等级查询 是从输出等级还是输出yes
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=107; 4 map <string,int> map1,map2,map3; 5 struct node { 6 string na; 7 bool flag; 8 int lev; 9 }; 10 node p[N]; 11 vector <node> role[N]; 12 vector <int> user[N]; 13 int np,nr,nu,q,ans; 14 node input_p() { 15 string str; cin>>str; 16 node tmp={"",0,0}; int i=0; 17 while (i<str.size()&&str[i]!=‘:‘) tmp.na+=str[i++]; 18 if (str[i]==‘:‘) { 19 tmp.lev=str[i+1]-‘0‘; 20 tmp.flag=1; 21 } 22 return tmp; 23 } 24 void find_p (int x,string na) { 25 for (int i=0;i<user[x].size();i++) { 26 int k=user[x][i]; 27 for (int j=0;j<role[k].size();j++) { 28 node nxt=role[k][j]; 29 if (na==nxt.na) ans=max(ans,nxt.lev); 30 } 31 } 32 } 33 int main () 34 { 35 cin>>np; 36 for (int i=1;i<=np;i++) { 37 p[i]=input_p(); 38 map1[p[i].na]=i; 39 } 40 cin>>nr; 41 for (int i=1;i<=nr;i++) { /// role - > p 42 string str; cin>>str; map2[str]=i; 43 int num; cin>>num; 44 for (int j=1;j<=num;j++) { 45 node tmp=input_p(); 46 role[i].push_back(tmp); 47 } 48 } 49 cin>>nu; 50 for (int i=1;i<=nu;i++) { 51 string str; cin>>str; map3[str]=i; 52 int num; cin>>num; 53 for (int j=1;j<=num;j++) { 54 string tmp; cin>>tmp; 55 user[i].push_back(map2[tmp]); 56 } 57 } 58 cin>>q; 59 while (q--) { 60 string str; cin>>str; int x=map3[str]; 61 node tmp=input_p(); 62 ans=-1; string na=tmp.na; int id=map1[na]; 63 find_p(x,na); 64 if (!tmp.flag&&p[id].flag) { 65 if (ans<0) cout<<"false "; 66 else cout<<ans<<" "; 67 } 68 else { 69 if (ans<tmp.lev) cout<<"false "; 70 else cout<<"true "; 71 } 72 } 73 return 0; 74 }
以上是关于CCF-权限查询-201612-3的主要内容,如果未能解决你的问题,请参考以下文章