1. 程式人生 > >CCF-權限查詢-201612-3

CCF-權限查詢-201612-3

權限 沒有 擔心 amp ole space code 查詢 using

這道題,開始只有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 }

CCF-權限查詢-201612-3