前面幾行的權限信息我直接跳過沒有用,因爲題目已經保證了輸入的合法性。(其實這麼做的時候,我還是有點心慌的,因爲有一次參賽的時候,使用了自以爲高明的方法結果只拿了10分🌚)
使用HashMap<UserName, HashMap<PrivilegeName, Integer>>來存儲用戶及其權限信息,使用同樣的結構來存儲角色信息。存儲時都要注意,同樣的權限多次出現時要對比等級。
另:我覺得這份代碼寫得不好看,歡迎大家多多批評指正我。
奉上耗時700ms的java滿分代碼
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
{
int n = Integer.parseInt(scanner.nextLine());
for (int i = 0; i < n; i++) {
scanner.nextLine();
}
}
HashMap<String, HashMap<String, Integer>> roles = new HashMap<>();
{
int n = Integer.parseInt(scanner.nextLine());
for (int i = 0; i < n; i++) {
String[] data = scanner.nextLine().split(" ");
String roleName = data[0];
HashMap<String, Integer> privileges = new HashMap<>();
for (int j = 2; j < data.length; j++) {
String privilege = data[j];
int level = -1;
if (privilege.contains(":")) {
int index = privilege.indexOf(":");
level = Integer.parseInt(privilege.substring(index + 1));
privilege = privilege.substring(0, index);
}
if(privileges.containsKey(privilege)){
if(privileges.get(privilege) < level)
privileges.put(privilege, level);
} else {
privileges.put(privilege, level);
}
}
roles.put(roleName, privileges);
}
}
HashMap<String, HashMap<String, Integer>> users = new HashMap<>();
{
int n = Integer.parseInt(scanner.nextLine());
for (int i = 0; i < n; i++) {
String[] data = scanner.nextLine().split(" ");
String userName = data[0];
HashMap<String, Integer> privileges = new HashMap<>();
for (int j = 2; j < data.length; j++) {
String roleName = data[j];
HashMap<String, Integer> rolePrivilege = roles.get(roleName);
for (Iterator<String> iterator = rolePrivilege.keySet().iterator(); iterator.hasNext(); ) {
String privilege = iterator.next();
int level = rolePrivilege.get(privilege);
if (privileges.containsKey(privilege)) {
if (privileges.get(privilege) < level) {
privileges.put(privilege, level);
}
} else {
privileges.put(privilege, level);
}
}
}
users.put(userName, privileges);
}
}
List<String> queries = new ArrayList<>();
{
int n = Integer.parseInt(scanner.nextLine());
for (int i = 0; i < n; i++) {
queries.add(scanner.nextLine());
}
}
scanner.close();
for (String query : queries) {
String[] data = query.split(" ");
String userName = data[0];
if (users.containsKey(userName)) {
HashMap<String, Integer> privileges = users.get(userName);
String privilege = data[1];
int level = -1;
if (privilege.contains(":")) {
int index = privilege.indexOf(":");
level = Integer.parseInt(privilege.substring(index + 1));
privilege = privilege.substring(0, index);
}
if (privileges.containsKey(privilege)) {
int userLevel = privileges.get(privilege);
if(level == -1){
System.out.println(userLevel == -1 ? String.valueOf(true) : String.valueOf(userLevel));
} else {
System.out.println(userLevel >= level);
}
} else {
System.out.println(false);
}
} else {
System.out.println(false);
}
}
}
}