AcWing 3239. 权限查询java
原题链接
中等
作者:
huaqingren
,
2021-03-04 16:28:56
,
所有人可见
,
阅读 448
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner scan=new Scanner(System.in);
Map<String,Integer> pmap=new HashMap<>();
Map<String,List<String>> rmap=new HashMap<>();
Map<String,List<String>> umap=new HashMap<>();
int p=scan.nextInt();
scan.nextLine();
while(p--!=0)
{
String str=scan.nextLine().trim();
int k=str.indexOf(':');
//不带等级的
if(k==-1)
{
pmap.put(str, -1);
}
else
{
String s1=str.substring(0, k);
int t=Integer.valueOf(str.substring(k+1));
pmap.put(s1,t);
}
}
int r=scan.nextInt();
scan.nextLine();
while(r--!=0)
{
String str=scan.nextLine();
String[] split = str.split("\\s+");
String role=split[0];
List<String> list=new ArrayList<>();
for(int i=2;i<split.length;i++)
{
list.add(split[i]);
}
rmap.put(role, list);
}
int u=scan.nextInt();
scan.nextLine();
while(u--!=0)
{
String str=scan.nextLine();
String[] split = str.split("\\s+");
String user=split[0];
List<String> list=new ArrayList<>();
for(int i=2;i<split.length;i++)
{
String role=split[i];
List<String> list2 = rmap.get(role);
for(int j=0;j<list2.size();j++)
list.add(list2.get(j));
}
umap.put(user, list);
}
//打印下所有用户的权限
// for(String user:umap.keySet())
// {
// List<String> list = umap.get(user);
// System.out.print(user+" :");
// for(int i=0;i<list.size();i++)
// System.out.print(list.get(i)+" ");
// System.out.println();
// }
int q=scan.nextInt();
scan.nextLine();
while(q--!=0)
{
String str=scan.nextLine();
String[] split = str.split("\\s+");
String user=split[0];
String permi=split[1];
//判断是否带冒号
String perStr="";
int perCount=-1;//不带参
int k=permi.indexOf(':');
if(k!=-1)
{
perStr=permi.substring(0, k);
int t=Integer.valueOf(permi.substring(k+1));
perCount=t;
}
else
{
perStr=permi;
}
List<String> list = umap.get(user);
if(pmap.get(perStr)==null||list==null)
System.out.println(false);
else
{
//无等级菜单
if(pmap.get(perStr)==-1)
{
boolean flag=false;
for(int i=0;i<list.size();i++)
{
if(list.get(i).equals(perStr))
{
flag=true;
break;
}
}
System.out.println(flag);
}
else
{
//有等级菜单
//查询权限最大值
if(perCount==-1)
{
int res=-1;
for(int i=0;i<list.size();i++)
{
int k2=list.get(i).indexOf(':');
if(k2!=-1)
{
String s=list.get(i).substring(0, k2);
if(s.equals(perStr))
{
int t=Integer.valueOf(list.get(i).substring(k2+1));
res=Math.max(res, t);
}
}
}
if(res!=-1)
System.out.println(res);
else
System.out.println(false);
}
else
{
//判断权限是否足够
int res=-1;
boolean flag=false;
for(int i=0;i<list.size();i++)
{
int k2=list.get(i).indexOf(':');
if(k2!=-1)
{
String s=list.get(i).substring(0, k2);
if(s.equals(perStr))
{
int t=Integer.valueOf(list.get(i).substring(k2+1));
res=Math.max(res, t);
flag=true;
}
}
}
if(flag&&perCount<=res)
System.out.println(true);
else
System.out.println(false);
}
}
}
}
scan.close();
}
}