題解:
先聲明一下,只完成了60分(有50%的樣例是 不帶等級權限+不帶等級的查詢,所以我考慮了帶等級的情況,但是沒有考慮好)
我的思路:
先來處理輸入:
- 每個權限作爲一個
pair<string,int>
,string表示權限的名字,int表示權限的等級(如果沒有等級就是-1)- 角色作爲一個結構體數組,每個元素保存了名稱、權限數量、具體的權限名稱
- 用戶作爲一個結構體數組,每個元素保存了名稱、角色數量、具體的角色名稱
- 每次輸入的用戶名和權限名就是string即可
然後考慮查詢過程:
調用一個QueryFun(userName,authorization)
函數進行查詢,返回值:
0:表示查詢不到對應的權限(沒有這個權限 or 對不帶等級權限的 帶等級查詢)
1:有這個權限(對不帶等級權限 的 不帶等級查詢)=2:輸出權限的等級(對帶等級權限的的 帶等級查詢 or 對帶等級權限的 不帶等級查詢)
再就是實現QueryFun函數的思路:
- 首先判斷查詢是否帶等級
- 開循環去遍歷:
遍歷所有的用戶名,如果連要查詢的用戶都沒有就直接return false
代碼:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 1e2+5;
int p;// 不同的權限類別的數量
pair <string,int> Authorization[MAX];// 不同的p個權限(包括帶等級和不帶等級的),權限的等級
int r;// 不同的角色數量
struct Role
{
string roleName;// 角色的名稱
int authorizationNum;// 角色的權限數量
vector <string> roleAuthorization;// 角色擁有的具體權限
};
Role role[MAX];
int u;// 不同的用戶數量
struct User
{
string userName;// 用戶的名稱
int roleNum;// 用戶的角色數量
vector <string> userRole;// 用戶擁有的具體角色
};
User user[MAX];
// 查詢函數主體(給定一個用戶名和一個權限名,根據題目的要求查詢並輸出)
int QueryFun(string userName,string authorization)
{
/*
輸出共 q 行,
每行爲 false、true,或者一個數字。
false 表示相應的用戶不具有相應的權限,
true 表示相應的用戶具有相應的權限。
對於分等級權限的不帶等級查詢,如果具有權限,則結果是一個數字,表示該用戶具有該權限的(最高)等級。
如果用戶不存在,或者查詢的權限沒有定義,則應該返回 false。
*/
/* 百分之五十的用例是無關等級的,我先直接拿一半的分數*/
int levelNum;
bool judgeLevel;
string authorizationName;
int len = authorization.length();
if(isdigit(authorization[len - 1]))
{
// 帶等級的查詢
judgeLevel = true;
levelNum = authorization[len-1] - '0';
authorizationName.assign(authorization,0,len-2);
}
else
{
// 不帶等級的查詢
judgeLevel = false;
levelNum = -1;
authorizationName.assign(authorization,0,len);
}
/* dubug: 輸出查詢的情況
if(judgeLevel == true)
{
cout << "帶等級查詢:" << authorization << endl;
cout << "權限:" << authorizationName << "等級:" << levelNum << endl;;
}
else
{
cout << "不帶等級查詢:" << authorization << endl;
cout << "權限:" << authorizationName << "等級:" << levelNum << endl;;
}*/
// 找到指定的用戶userName
for(int i = 1; i <= u; i++)
{
if(user[i].userName == userName)
{
// 找到這個用戶的角色,因爲角色會具有一些權限
for(int j = 0; j < user[i].roleNum; j++)
{
for(int k = 1; k <= r; k++)
{
if(role[k].roleName == user[i].userRole[j])
{
// 找到這個角色的權限
for(int m = 0; m < role[k].authorizationNum; m++)
{
// 不帶等級查詢
if(judgeLevel == false)
{
// 如果用戶的角色有authorization這個權限
// 則要判斷該權限有無等級
// 1.如果是對 帶等級權限 的 不帶等級查詢,則輸出最高等級
// 2.如果是對 不帶等級權限的 的 不帶等級查詢,則輸出true
int len = role[k].roleAuthorization[m].length();
string tmp;
tmp.assign(role[k].roleAuthorization[m],0,len-2);
if(isdigit(role[k].roleAuthorization[m][len - 1]))
{
if(tmp == authorizationName)
{
//return levelNum;// 不是輸出最高等級嗎
return (role[k].roleAuthorization[m][len - 1] - '0');
}
}
if(role[k].roleAuthorization[m] == authorizationName)
{
return true;
}
}
else// 帶等級查詢
{
// 如果用戶的角色有authorization這個權限
// 則要判斷
// 1.如果是對 帶等級權限 的 帶等級查詢,則要判斷等級是否一致,如果一致才能輸出true
// 2.如果是對 不帶等級權限的 的 帶等級查詢,則直接輸出false
/*
if(role[k].roleAuthorization[m] == authorization)
{
return true;// 待優化
}
*/
int len = role[k].roleAuthorization[m].length();
string tmp;
tmp.assign(role[k].roleAuthorization[m],0,len-2);
if(isdigit(role[k].roleAuthorization[m][len - 1]))
{
if(tmp == authorizationName && (role[k].roleAuthorization[m][len - 1] - '0') == levelNum)
{
return true;
}
}
else
{
if(role[k].roleAuthorization[m] == authorizationName)
{
return false;
}
}
}
}
}
}
}
}
}
// 輸入的用戶對應的權限(不看等級的)存在,在前面就直接返回true了
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string str;
cin >> p;
for(int i = 1; i <= p; i++)
{
cin >> str;
int len = str.length();
/* 帶等級的樣例*/
if(isdigit(str[len-1]))
{
// 帶等級的權限
Authorization[i].second = str[len-1] - '0';
Authorization[i].first = str.assign(str,0,len-2);
}
else
{
// 不帶等級的權限
Authorization[i].second = -1;
Authorization[i].first = str.assign(str,0,len);
}
Authorization[i].second = -1;
Authorization[i].first = str;
}
/* cout << "debug: 權限的情況:" << endl;
for(int i = 1; i <= p; i++)
{
cout << authorization[i].first << endl;
}*/
cin >> r;
for(int i = 1; i <= r; i++)
{
cin >> role[i].roleName >> role[i].authorizationNum;
string authorization;
for(int j = 1; j <= role[i].authorizationNum; j++)
{
cin >> authorization;
role[i].roleAuthorization.push_back(authorization);
}
}
/* cout << "debug: 角色的情況:" << endl;
for(int i = 1; i <= r; i++)
{
cout << role[i].roleName << " " << role[i].authorizationNum;
for(auto it = role[i].roleAuthorization.begin(); it != role[i].roleAuthorization.end(); it++)
{
cout << " " << *it;
}
cout << endl;
}*/
cin >> u;
for(int i = 1; i <= u; i++)
{
cin >> user[i].userName >> user[i].roleNum;
string role;
for(int j = 1; j <= user[i].roleNum; j++)
{
cin >> role;
user[i].userRole.push_back(role);
}
}
/* cout << "debug: 用戶的情況:" << endl;
for(int i = 1; i <= r; i++)
{
cout << user[i].userName << " " << user[i].roleNum;
for(auto it = user[i].userRole.begin(); it != user[i].userRole.end(); it++)
{
cout << " " << *it;
}
cout << endl;
}*/
int q;// 查詢次數,用來查詢用戶的權限
cin >> q;
string userName,authorization;// 用戶名稱 , 要查詢的權限
for(int i = 1; i <= q; i++)
{
cin >> userName >> authorization;
int res = QueryFun(userName,authorization);
if(res == 0)
{
cout << "false" << endl;
}
else
{
if(res == 1)
{
cout << "true" << endl;
}
else
{
cout << res << endl;
}
}
}
return 0;
}