問題描述: |
問題描述 Markdown 是一種很流行的輕量級標記語言(lightweight markup language),廣泛用於撰寫帶格式的文檔。例如以下這段文本就是用 Markdown 的語法寫成的: 輸入格式 輸入由若干行組成,表示一個用本題規定的 Markdown 語法撰寫的文檔。 輸出格式 輸出由若干行組成,表示輸入的 Markdown 文檔轉換成產生的 HTML 代碼。 樣例輸入 # Hello 樣例輸出 <h1>Hello</h1> 評測用例規模與約定 本題的測試點滿足以下條件:●本題每個測試點的輸入數據所包含的行數都不超過100,每行字符的個數(包括行末換行符)都不超過100。 ●除了換行符之外,所有字符都是 ASCII 碼 32 至 126 的可打印字符。 ●每行行首和行末都不會出現空格字符。 ●輸入數據除了 Markdown 語法所需,內容中不會出現 `#`、`*`、`_`、`[`、`]`、`(`、`)`、`<`、`>`、`&` 這些字符。 ●所有測試點均符合題目所規定的 Markdown 語法,你的程序不需要考慮語法錯誤的情況。 每個測試點包含的語法規則如下表所示,其中“√”表示包含,“×”表示不包含。
提示 由於本題要將輸入數據當做一個文本文件來處理,要逐行讀取直到文件結束,C/C++、Java 語言的用戶可以參考以下代碼片段來讀取輸入內容。 解題思路:採用集合嵌套的方式來對數據進行存儲。對於角色屬性:外層採用HashMap集合的方式,將對應角色的名稱作爲鍵,再嵌套一個HashMap作爲值存儲相應的權限及等級(權限名爲鍵,權限等級爲值)。對於用戶屬性 :與角色屬性結構相似,外層用對應角色名稱作爲鍵,內層複製其擁有的角色的最高級權限名稱與等級。對於查詢:優先判斷權限,角色,用戶是否存在,然後判斷權限本身是否分級,查詢需求是否分級,從存儲的用戶HashMap中按照權限名稱查找該權限即可。易錯點:角色屬性可能擁有兩個相同的名稱而等級不同的權限,應取等級最高值 |
package permissionQuery;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
//存儲權限各類型名稱及最高層級
public static Map<String, Integer> perm=new HashMap<>();
//存儲該角色名及所擁有權限及最高等級
public static Map<String,HashMap<String,Integer>> roles=new HashMap<>();
//存儲該用戶名及所擁有權限及最高等級
public static Map<String,HashMap<String,Integer>> users=new HashMap<>();
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int p=sc.nextInt();//權限類型數目
for(int i=0;i<p;i++)
{
String[] temp=sc.next().split(":");
if(temp.length==1)
perm.put(temp[0],-1);//無權限等級則設爲-1
else
perm.put(temp[0],Integer.valueOf(temp[1]));
}
int r=sc.nextInt();//角色類型數目
for(int i=0;i<r;i++)
{
//存儲該角色所擁有的權限名稱及權限最高等級
HashMap<String,Integer> perms=new HashMap<>();
String roleName=sc.next();//角色名稱
int permsNum=sc.nextInt();
for(int t=0;t<permsNum;t++)
{
String[] temp=sc.next().split(":");//temp2下標0權限名,下標1該權限等級
if(temp.length==1)//判斷權限是否含有等級
perms.put(temp[0],-1);//權限名,該權限等級,無等級爲-1
else
{
if(perms.containsKey(temp[0]))//若存在該權限則取該權限的最高等級進行存儲
{
if(perms.get(temp[0])<Integer.valueOf(temp[1]))//比較權限等級大小
perms.put(temp[0], Integer.valueOf(temp[1]));
}
else
perms.put(temp[0], Integer.valueOf(temp[1]));
}
}
roles.put(roleName, perms);
}
int u=sc.nextInt();//用戶數目
for(int i=0;i<u;i++)
{
String userName=sc.next();//用戶名稱
//存儲該用戶所擁有的權限名稱及權限最高等級
HashMap<String,Integer> perms=new HashMap<>();
//將所擁有的角色類型中所擁有的權限轉存儲至用戶的perms中
int rolesNum=sc.nextInt();
for(int t=0;t<rolesNum;t++)//彙總所擁有的全部角色權限
{
//由角色名得到該角色所有權限名及等級
for(Map.Entry<String, Integer> m:roles.get(sc.next()).entrySet())
{
String key=m.getKey();
int value=m.getValue();
if(perms.containsKey(key))//若存在該權限則取該權限的最高等級進行存儲
{
if(perms.get(key)<value)//比較權限等級大小
perms.put(key, value);
}
else
perms.put(key, value);
}
}
users.put(userName, perms);
}
int q=sc.nextInt();//查詢語句數目
String[] result=new String[q];
Query:for(int i=0;i<q;i++)//執行查詢
{
String squeryName=sc.next();//待查詢用戶名
String[] temp=sc.next().split(":");//下標0爲待查詢權限名,若存在下標1則爲權限等級
if(!users.containsKey(squeryName))//判斷用戶是否存在
{
result[i]="false";
continue Query;
}
else if(!perm.containsKey(temp[0]))//判斷權限是否存在
{
result[i]="false";
continue Query;
}
else if(temp.length==1)//查詢權限不分等級
{
result[i]=queryResult(squeryName,temp[0],-1);
}
else {//查詢權限分等級
result[i]=queryResult(squeryName,temp[0],Integer.valueOf(temp[1]));
}
}
for(String s:result)
System.out.println(s);
}
//執行權限查詢並返回結果,參數待查詢用戶名,待查詢權限名,所需查詢該權限的等級
public static String queryResult(String userName,String permName,int queryLevel)
{
if(!users.get(userName).containsKey(permName))//判斷該用戶是否具有該權限
{
return "false";
}
else//判斷該用戶該權限等級是否匹配
{
if(queryLevel!=-1)//查詢分等級
{
//判斷用戶所擁有權限是否大於所需查詢權限
if(users.get(userName).get(permName)>=queryLevel)
return "true";
else
return "false";
}
else//查詢不分等級
{
if(perm.get(permName)==-1)//權限本身不分級,返回True/False
return "true";
else//權限本身分級,返回最高級別
return String.valueOf(users.get(userName).get(permName));
}
}
}
}