CCF-201612-3

我们先来看一下题目吧



解题思路
真的很恼火,思路简单,写起来比较繁琐。
全部存下来,然后一个一个查,查到了true,否则false,如果是无等级查询可能会返回等级
挺费时间的,没办法,后面的算法题不会,只能刚模拟了
查询一般用map比较方便,尝试过map,但是因为map的对应值唯一,所以好像会掉分,一直没解决。
这题就是直接vector爆搜,大力出奇迹啊!!!
注意点
一定要边写边编译,写完了最后一起来找bug太难找了,一个模块一个模块的找,比较好,而且有助于保持清晰的思路。
代码
#include<iostream>
#include<vector>
using namespace std;
struct priv{
string name;
int rank;
};
struct role{
string name;
vector<priv> privilege;
};
struct user{
string name;
vector<string> role_name;
};
vector<role> roles;
vector<user> users;
int main(){
int p,r,u,q;
cin>>p;
while(p--){
string cate;
cin>>cate;
}
cin>>r;
while(r--){
role t;
priv t2;
cin>>t.name;
int n;
cin>>n;
while(n--){
string temp;
cin>>temp;
if(temp[temp.length()-2]==':'){
t2.name=temp.substr(0,temp.length()-2);
t2.rank=temp[temp.length()-1]-'0';
}else{
t2.name=temp;
t2.rank=10;
}
t.privilege.push_back(t2);
}
roles.push_back(t);
}
cin>>u;
while(u--){
user t;
cin>>t.name;
int n;
cin>>n;
while(n--){
string temp;
cin>>temp;
t.role_name.push_back(temp);
}
users.push_back(t);
}
cin>>q;
while(q--){
string name,p,p_name;
int p_rank=-1;
cin>>name>>p;
int flag=0;
if(p[p.length()-2]==':'){//查询带等级,先提取
p_name=p.substr(0,p.length()-2);
p_rank=p[p.length()-1]-'0';
}
for(int i=0;i<users.size();i++){
if(users[i].name==name){//找到对应的人
for(int j=0;j<users[i].role_name.size();j++){//这个人有多个角色
for(int k=0;k<roles.size();k++){
if(users[i].role_name[j]==roles[k].name){//找到这个人的每个角色
for(int l=0;l<roles[k].privilege.size();l++){//每个角色有多个权限
if(roles[k].privilege[l].rank==10){//当前遍历权限无rank
//输入的权限无rank直接比较
if(roles[k].privilege[l].name==p) {
flag=1;
break;
}
}else{//当前扁你权限有rank
if(p[p.length()-2]==':'){//查询带等级
if(roles[k].privilege[l].name==p_name&&roles[k].privilege[l].rank>=p_rank){
flag=1;
break;
}
}else{//查询不带等级
if(roles[k].privilege[l].name==p){
if(roles[k].privilege[l].rank>p_rank){
flag=2;
p_rank=roles[k].privilege[l].rank;
}
}
}
}
}
}
if(flag==1) break;
}
if(flag==1) break;
}
if(flag==1) break;
}
}
if(flag==2) cout<<p_rank<<endl;
else if(flag==1) cout<<"true"<<endl;
else cout<<"false"<<endl;
}
return 0;
}
