題目分析
來源:acwing
分析:這樣的模擬題,主要難在建模,需要思考用什么來存儲。
這里用一個結構體來存權限。用哈希表來存<角色,權限結構體>的映射,當然權限結構體存在set中,需要去重(因為題目說明可能存在重復的讀入,只不過等級不同)。這里用好結構體內部的構造函數,用字符串來初始化是有等級權限還是無等級權限。
ac代碼
#include<bits/stdc++.h>
using namespace std
;
struct P
{string name
;mutable int level
; P(string str
){int k
= str
.find(':');if(k
== -1) name
= str
, level
= -1;else{name
= str
.substr(0, k
);level
= stoi(str
.substr(k
+1));}}bool operator<(const P
& t
)const{return name
< t
.name
;}
};
unordered_map
<string
, set
<P
>> role
, person
;int main(){int n
;string str
;cin
>> n
;while(n
--) cin
>> str
; cin
>> n
;while(n
--){string name
;int cnt
;cin
>> name
>> cnt
;auto& r
= role
[name
];while(cnt
--){cin
>> str
;P
t(str
); if(t
.level
== -1) r
.insert(t
);else{if(!r
.count(t
)) r
.insert(t
);else{auto it
= r
.find(t
); it
->level
= max(it
->level
, t
.level
);}}}}cin
>> n
;while(n
--){string name
;int cnt
;cin
>> name
>> cnt
;auto& p
= person
[name
]; while(cnt
--){string str
;cin
>> str
;for(auto& t
:role
[str
]){if(t
.level
== -1) p
.insert(t
); else{if(!p
.count(t
)) p
.insert(t
);else{auto it
= p
.find(t
);it
-> level
= max(it
->level
, t
.level
);}}}}}cin
>> n
;while(n
--){string user
, pr
;cin
>> user
>> pr
;P
t(pr
);auto& p
= person
[user
];if(!p
.count(t
)) puts("false");else{auto it
= p
.find(t
);if(t
.level
!= -1){ if(it
->level
>= t
.level
) puts("true");else puts("false");}else{ if(it
->level
== -1) puts("true");else cout
<< it
->level
<< endl
;}}}
}
題目鏈接
https://www.acwing.com/problem/content/3242/
總結
以上是生活随笔為你收集整理的CSP认证201612-3权限查询[C++题解]:模拟题、结构体、set、有点复杂的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。