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

\[用户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. RALM: 实时 Look-alike 算法在微信看一看中的应用

    嘉宾:刘雨丹 腾讯 高级研究员 整理:Jane Zhang 来源:DataFunTalk 出品:DataFun 注:欢迎关注DataFunTalk同名公众号,收看第一手原创技术文章. 导读:本次分享是 ...

  2. PHP-会话控制Cookie和Session

    会话控制:就是为了我们在访问页面和页面之间的跳转是,能够识别到你的登录状态,已经你的登录时长等 在php的会话控制当中,涉及到两个概念Cookie和Session Cookie 会话控制 原理:在登录 ...

  3. head first 设计模式第一章笔记

    设计模式是告诉我们如何组织类和对象以解决某种问题. 学习设计模式,也就是学习其他开发人员的经验与智慧,解决遇到的相同的问题. 使用模式的最好方式是:把模式装进脑子,然后在设计的时候,寻找何处可以使用它 ...

  4. Codecommit

    1. 生成IAM 用户组并附权限. 2.生成IAM用户并加入组. 3. 为用户生成key-pair 4. 上传公钥到aws 5. 配置config文件,其中user是aws 为公钥生成的id. 6. ...

  5. 2018092609-2 选题 Scrum立会报告+燃尽图 02

    此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2019fall/homework/8683] 一.小组情况组长:迟俊文组员:宋晓丽 梁梦瑶 韩昊 刘信鹏队名 ...

  6. Golang 入门系列(十六)锁的使用场景主要涉及到哪些?读写锁为什么会比普通锁快

    前面已经讲过很多Golang系列知识,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863.html, 接下来要说的 ...

  7. H3C交换机DHCP基础配置案例 v7版本

    一.需求 要求在Switch A上配置DHCP服务器功能实现:• 为网络内的客户端动态分配 10.1.1.0/24 网段内的 IP 地址.租用有效期限. DNS 信息.网关地址等配置信息:• 根据 S ...

  8. 2场 J -Subarray

    题意: 长度为1e91e9的(1,−1)(1,−1)序列,下标从00到1e9−11e9−1,已知有nn个区间为11,其他为−1−1, 问存在多少个区间的和>1>1(保证∑1≤i≤nr[i] ...

  9. mr的partition分区

    1.Partitioner 组件通过让 Map 对 Key 进行分区,从而将不同分区的 Key 交由不同的 Reduce 处理.Partition属于map端 2.分区的总数与任务的reduce任务数 ...

  10. java关键字 保留字

    Java 关键字和保留字 Java 关键字列表 (依字母排序 共51组): abstract, assert,boolean, break, byte, case, catch, char, clas ...