嘘~ 正在从服务器偷取页面 . . .

CCF权限查询---解释一下什么是“大力出奇迹”


CCF-201612-3

下面都不会了

我们先来看一下题目吧

1
2
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;
}

结果


版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 梦想成为假面骑士的司祎同学 !
赏
评论
评论
 上一篇
CCF炉石传说---谁说玩游戏对学习没帮助的? CCF炉石传说---谁说玩游戏对学习没帮助的?
CCF-201609-3 我们先来看一下题目 解题思路大模拟题,他怎么说就怎么写不理解题意的自己去搓两把炉石传说就懂了!存储随从用vector,这个增删随从方便呀! 代码#include<iostream> #include<c
2020-09-06
下一篇 
CCFMarkdown---用到了状态机的思想 CCFMarkdown---用到了状态机的思想
CCF-201703-3 题目如下 解题思路1.先处理行内的强调和超级链接2.然后处理区块,用到了状态机思想(第一次切换状态的时候加前一状态的后缀和现在状态的前缀)3.过了样例后只有60分,把写的函数全部不用了,一起写到主函数,突然就可以了
2020-09-06
  目录