前面几行的权限信息我直接跳过没有用,因为题目已经保证了输入的合法性。(其实这么做的时候,我还是有点心慌的,因为有一次参赛的时候,使用了自以为高明的方法结果只拿了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);
}
}
}
}