这道题,开始只有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\n"; 
66             else       cout<<ans<<"\n";
67         } 
68         else {
69             if (ans<tmp.lev) cout<<"false\n";
70             else             cout<<"true\n";
71         } 
72     }
73     return 0;
74 }