map的写法上参考了:添加链接描述
但它忘记处理同一个角色出现重复权限的问题,没有取最大值,丢了10分。
map还是蛮好用的,第一次写用struct写疯了。
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int p,r,u,q;
map<string,int> orig;//权限集合
map<string,map<string,int> > role;//角色集合
map<string,vector<string> > user;//用户集合
int main(){
//freopen("kk.txt","r",stdin);
cin>>p;
for(int i=0;i<p;i++){
string tmp;cin>>tmp;
int l=tmp.size();
if(tmp[l-2]==':'){
string t;
for(int j=0;j<l-2;j++){t+=tmp[j];}
orig[t]=tmp[l-1]-'0';
}
else orig[tmp]=-1;
}
cin>>r;
for(int i=0;i<r;i++){
map<string ,int>pr;
string name,tmp;int num;
cin>>name>>num;
for(int j=0;j<num;j++){
cin>>tmp;
int l=tmp.size();
if(tmp[l-2]==':'){
string t;
for(int j=0;j<l-2;j++){t+=tmp[j];}
pr[t]=max(pr[t],tmp[l-1]-'0');
}
else pr[tmp]=-1;
}
role[name]=pr;
}
cin>>u;
for(int i=0;i<u;i++){
vector<string>v;
string name,tmp;int num;
cin>>name>>num;
for(int j=0;j<num;j++){
cin>>tmp;
v.push_back(tmp);
}
user[name]=v;
}
cin>>q;
for(int i=0;i<q;i++){
string name,tmp;
int level;
cin>>name>>tmp;
int l=tmp.size();
if(tmp[l-2]==':'){
string t;
for(int j=0;j<l-2;j++){t+=tmp[j];}
level=tmp[l-1]-'0';
tmp=t;
}
else level=-1;
//遍历用户集合和权限集合,查找有无该用户,权限。
//若不合法,返回false,开启下次遍历
if(user.count(name)==0||orig.count(tmp)==0){
cout<<"false"<<endl;
continue;
}
//若合法,在该用户集合中查找所有角色
vector<string>v=user[name];
int flag=0,lev=-1;
if(level!=-1){//不分等级权限的查询
for(int j=0;j<v.size();j++){
map<string,int>m=role[v[j]];
if(m.count(tmp)>=1){
flag=1;
lev=max(lev,m[tmp]);
}
}
if(flag==1&&lev>=level){cout<<"true"<<endl;}
else cout<<"false"<<endl;
}
else if(level==-1){//在角色集合中查找匹配的权限,取最大值
if(orig[tmp]==-1){//分等级权限的不带等级查询
for(int j=0;j<v.size();j++){
map<string,int>m=role[v[j]];
if(m.count(tmp)>=1){flag=1;}
}
if(flag==1){cout<<"true"<<endl;}
else cout<<"false"<<endl;
}
else{//分等级权限的带等级查询
for(int j=0;j<v.size();j++){
map<string,int>m=role[v[j]];
if(m.count(tmp)>=1){
flag=1;
lev=max(lev,m[tmp]);
}
}
if(flag==1&&lev>=level){cout<<lev<<endl;}
else cout<<"false"<<endl;
}
}
}
return 0;
}
这里虽然没有用得到,当个人觉得map的遍历还是要看一下:
void show(map<string, int> orig){
map<string, int>::iterator im = orig.begin();
while (im != orig.end()) {
cout << im->first << " : " << im->second << endl;
im++;
}
}