一共有三层信息,三层信息的依赖关系是:

\[用户user->角色role->权限authority
\]

先存储\(authority\)信息,\(role\)直接存储\(authority\)对应序号的信息,\(user\)通过\(role\)直接存储的是\(authority\)对应序号的信息。

剩下的就是字符串处理了。

唯一的坑点大概就是查询的时候\(user\)和\(authority\)名字可能没有出现过。

#include <bits/stdc++.h>
const int maxn = 100; using namespace std; struct tAuthority
{
char category[40];
bool hasLevel;
int level;
};
tAuthority authority[maxn + 5]; struct tRole
{
char role[40];
bool hasAuthority[maxn + 5];
int level[maxn + 5];
tRole()
{
memset(hasAuthority, 0, sizeof(hasAuthority));
memset(level, -1, sizeof(level));
}
};
tRole role[maxn + 5]; struct tUser
{
char user[40];
bool hasAuthority[maxn + 5];
int level[maxn + 5];
tUser()
{
memset(hasAuthority, 0, sizeof(hasAuthority));
memset(level, -1, sizeof(level));
}
};
tUser user[maxn + 5]; int main()
{
int p;
scanf("%d", &p);
for (int i = 1; i <= p; i++)
{
char temp[40];
scanf("%s", temp);
int len = strlen(temp);
if (temp[len - 2] == ':')
{
authority[i].hasLevel = true;
authority[i].level = temp[len - 1] - '0';
temp[len - 2] = '\0';
}
else
{
authority[i].hasLevel = false;
}
strcpy(authority[i].category, temp);
} int r;
scanf("%d", &r);
for (int i = 1; i <= r; i++)
{
scanf("%s", role[i].role);
int s;
scanf("%d", &s);
while (s--)
{
char temp[40];
scanf("%s", temp);
int len = strlen(temp);
if (temp[len - 2] == ':')
{
temp[len - 2] = '\0';
}
for (int j = 1; j <= p; j++)
{
if (strcmp(authority[j].category, temp) == 0)
{
role[i].hasAuthority[j] = true;
if (temp[len - 1] >= '0' && temp[len - 1] <= '9')
role[i].level[j] = max(role[i].level[j], temp[len - 1] - '0');
break;
}
}
}
} int u;
scanf("%d", &u);
for (int i = 1; i <= u; i++)
{
scanf("%s", user[i].user);
int t;
scanf("%d", &t);
while (t--)
{
char temp[40];
scanf("%s", temp);
for (int j = 1; j <= r; j++)
{
if (strcmp(role[j].role, temp) == 0)
{
for (int k = 1; k <= p; k++)
{
if (role[j].hasAuthority[k])
{
user[i].hasAuthority[k] = true;
user[i].level[k] = max(user[i].level[k], role[j].level[k]);
}
}
break;
}
}
}
} int q;
scanf("%d", &q);
while (q--)
{
char temp1[40], temp2[40];
bool flag1 = false, flag2 = false;
scanf("%s%s", temp1, temp2);
int len = strlen(temp2);
if (temp2[len - 2] == ':')
temp2[len - 2] = '\0';
for (int i = 1; i <= u; i++)
{
if (strcmp(user[i].user, temp1) == 0)
{
flag1 = true;
int id = 0;
for (; id <= p && strcmp(authority[id].category, temp2) != 0; id++);
if (id <= p)
{
flag2 = true;
// printf("query case: %d %d %s\n", i, id, authority[id].category);
if (user[i].hasAuthority[id])
{
if (temp2[len - 1] >= '0' && temp2[len - 1] <= '9')
{
if (user[i].level[id] >= temp2[len - 1] - '0')
printf("true\n");
else
printf("false\n");
}
else
{
if (authority[id].hasLevel)
printf("%d\n", user[i].level[id]);
else
printf("true\n");
}
}
else
{
printf("false\n");
}
}
break;
}
}
if (!flag1 || !flag2)
printf("false\n");
} return 0;
}

CCF-CSP题解 201612-3 权限查询的更多相关文章

  1. CCF CSP 201612-3 权限查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201612-3 权限查询 问题描述 授权 (authorization) 是各类业务系统不可缺 ...

  2. CCF CSP 201709-3 JSON查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-3 JSON查询 问题描述 JSON (JavaScript Object Not ...

  3. ccf 201612-3 权限查询

     ccf 201612-3 权限查询 解题思路: 建立一个二维矩阵存储权限和角色 还差30分emmm #include<iostream> #include<cstring> ...

  4. CCF 权限查询(模拟)

    试题编号: 201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统 ...

  5. CSP 201612-3 权限查询 【模拟+STL】

    201612-3 试题名称: 权限查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权 ...

  6. CCF CSP 201403-2 窗口

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-2 窗口 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标 ...

  7. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  8. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  9. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  10. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

随机推荐

  1. 动手造轮子:实现简单的 EventQueue

    动手造轮子:实现简单的 EventQueue Intro 最近项目里有遇到一些并发的问题,想实现一个队列来将并发的请求一个一个串行处理,可以理解为使用消息队列处理并发问题,之前实现过一个简单的 Eve ...

  2. fastjson 1.2.24反序列化导致任意命令执行漏洞分析记录

    环境搭建: 漏洞影响版本: fastjson在1.2.24以及之前版本存在远程代码执行高危安全漏洞 环境地址: https://github.com/vulhub/vulhub/tree/master ...

  3. vant-ui的van-area使用

    由于官方例子中并没有太多详情,因此记录之,方便以后使用. 1.配置 :area-list="areaList",以初始化全部省市区的数据,其中area.js文件在官方可以下载,放于 ...

  4. Kibana创建索引成功,但一直不显示出来(Fielddata is disabled on text fields by default. Set fielddata=true........)

    现象 把EFK整个集群搭建完成后,通过Kibana操作界面创建索引(如图1),我创建了lile-zabbix*的索引,显示是创建成功了,但是只要我在重新刷新一次,已经创建的索引就“消失了”.后通过查看 ...

  5. 20191031-9 beta week 1/2 Scrum立会报告+燃尽图 07

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9917 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...

  6. MySQL 库、表、记录、相关操作(3)

    MySQL 库.表.记录.相关操作(3) 单表查询 """ 增: insert [into] [数据库名.]表名[(字段1[, ..., 字段n])] values (数 ...

  7. 手机端web(iPad)页面自适应js

    有关编写手机页面(ipad页面)自适应的方法有很多,比如:bootstrap,rem等等.下面分享给大家一个js控制viewPort视区自适应缩放的方法(我给它命名为phone.js): 将phone ...

  8. 教你如何关闭IIS服务

    由于IIS服务器和Apache的默认端口号都是80端口,有时我们需要关闭IIS服务,下面讲讲关闭IIS服务的方法.   方法如下:   1.services.msc,在里面找到一个“World Wid ...

  9. 【重磅资料】ArchSummit全球架构师峰会·2019华为云技术专场资料下载

    ArchSummit全球架构师峰会是InfoQ中国团队推出的重点面向高端技术管理者.架构师的技术会议,54%参会者拥有8年以上工作经验.ArchSummit聚焦业界强大的技术成果,秉承"实践 ...

  10. Python异常处理与上下文管理器

    Python异常处理 异常与错误 错误 可以通过IDE或者解释器给出提示的错误opentxt('a.jpg','r') 语法层面没有问题,但是自己代码的逻辑有问题if age>18: print ...