1.解题思路
这题要考虑的方面挺多。。。特别是考虑当一个角色拥有相同权限名但不同等级的权限时,一定要取最大的等级(否则只有90分),首先建立角色和权限的映射,再建立用户和角色的映射,通过这两个映射得出用户和权限的映射,注意对于有等级的权限始终保留最大等级的权限。
2.满分代码
#include<iostream>
#include<map>
#include<vector>
using namespace std;
map<string,vector<string>>user;//用户--角色
map<string,map<string,int>>role;//角色--权限
string users[10000];
map<string,map<string,int>>up;
int p,r,u,q;
string str,rolename,username,pname;
int rolenum,usernum;
int main()
{
cin>>p;
for(int i=1;i<=p;i++)
{
cin>>str;
}
cin>>r;
for(int i=1;i<=r;i++)
{
cin>>rolename;
cin>>rolenum;
map<string,int>mp;
for(int j=1;j<=rolenum;j++)
{
cin>>str;
int x=str.find(':');
if(x!=str.npos)
{
mp[str.substr(0,x)]=max(str[x+1]-'0',mp[str.substr(0,x)]);//一定考虑这种情况 不然只有90
}
else
mp[str]=-1;//无权限等级
}
role[rolename]=mp;
}
cin>>u;
for(int i=1;i<=u;i++)
{
cin>>username;
cin>>usernum;
users[i]=username;
for(int j=1;j<=usernum;j++)
{
cin>>str;
user[username].push_back(str);
}
}
for(int k=1;k<=u;k++)
{
string username=users[k];
map<string,int>mp;
for(int i=0;i<user[username].size();i++)
{
string rname=user[username][i];//该用户的角色
map<string,int>tmp=role[rname];//该角色对应的权限集合
for(auto it:tmp)
{
if(mp.find(it.first)==mp.end())
{
mp[it.first]=it.second;
}
else if(mp[it.first]!=-1&&mp[it.first]<it.second)
{
mp[it.first]=it.second;
}
}
}
up[username]=mp;
}
cin>>q;
while(q--)
{
int level;
cin>>username>>pname;
int x=pname.find(':');
if(x==pname.npos)
level=-1;//查询不带等级
else//查询带等级
{
level=pname[x+1]-'0';
pname.erase(x,2);
}
if(user.find(username)==user.end())//用户不存在
{
cout<<"false"<<endl;
}
else
{
map<string,int>mp=up[username];//该用户拥有的所有权限
if(mp.find(pname)!=mp.end())//找到了相应权限
{
if(level==-1)//查询不带等级
{
if(mp[pname]==-1)
cout<<"true"<<endl;
else
cout<<mp[pname]<<endl;
}
else//查询指定了等级
{
if(level<=mp[pname])
cout<<"true"<<endl;
else
cout<<"false"<<endl;
}
}
else
{
cout<<"false"<<endl;
}
}
}
return 0;
}