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

\[用户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. 天啦!竟然从来没有人讲过 SpringBoot 支持配置如此平滑的迁移

    SpringBoot 是原生支持配置迁移的,但是官方文档没有看到这方面描述,在源码中才看到此模块,spring-boot-properties-migrator,幸亏我没有跳过.看到这篇文章的各位,可 ...

  2. vue 解决跨域

    先上报错 以表尊重 在vue中 找到 config文件夹中的 index.js文件  配置更改如下 proxyTable: { '/api': { target: 'http://47.240.11. ...

  3. vue computed计算属性 watch监听

    计算属性 computed:{ 变量:function(){ return 计算好的值 } } 这时候计算好的值 就付给了你的变量 在实例中可以this.使用 注意 声明的变量的data中不可以重复声 ...

  4. 2019-9-23:渗透测试,基础学习,http协议数据包的认识,html css的认识,笔记

    Burp suite功能模块Dashboard:扫描Proxy:拦截包,代理 drop:放弃Intruder:爆破Decoder:编码,解码repeater:重放comparer:比较 BP,prox ...

  5. (四十四)golang--协程(goroutine)和管道(channel)相结合实例

    统计1-8000之间的素数. 整体框架: 说明:有五个协程,三个管道.其中一个协程用于写入数字到intChan管道中,另外四个用于取出intChan管道中的数字并判断是否是素数,然后将素数写入到pri ...

  6. sku二维数组里的数组从头到尾叠加组合

    今天工作之余与同事聊天,要是实现一个sku描述里的字段组合的问题.并且实现了请吃饭.哈哈.一顿饭,我和另一位同事积极杠杆的.后来实现了出来. let skuList = [ ['黑色', '白色',' ...

  7. String字符串为什么不可变的深入理解

    String是被final修饰的,是不可变对象,那么这句什么意思呢.在学习scala时候var,val时候,就想到这个问题,所以记录下 看案例: package com.cxy; import sun ...

  8. linux目录相关操作

    mkdir:新建目录 mkdir [-mp] 目录名称 -m:配置文件权限,直接设置,不需要看默认权限(umask) -p:递归创建目录 rmdir:删除空目录 rmdir [-p] 目录名称 -p: ...

  9. JavaScript-----2初识

    1.介绍 JavaScript是一种运行在客户端(自己的电脑上)的脚本语言不是在服务器上 脚本语言:不需要编译,运行过程由JS解释器(js引擎)逐行进行解释并执行 JavaScript不仅可以做前端编 ...

  10. 【Android - 控件】之MD - CoordinatorLayout的使用

    CoordinatorLayout是Android 5.0新特性——Material Design中的一个布局控件,主要用来协调各个子视图之间的工作,也可以用来作为顶部布局.CoordinatorLa ...