FZU 2152 文件系统 (小模拟)

   

   Problem 2152 文件系统

Time Limit: 1000 mSec    Memory Limit : 32768 KB

Problem Description

每个Linux文件具有四种访问权限:可读(r)、可写(w)、可执行(x)和无权限(-)。

利用ls -l命令可以看到某个文件或目录的权限,它以显示数据的第一个字段为准。第一个字段由10个字符组成,如下:

-rwxr-xr-x

第1位表示文件类型,-表示文件,d表示目录

2-4位表示文件所有者的权限,u权限

5-7位表示文件所属组的成员的权限,g权限

8-10位表示所有者和所属组的成员之外的用户的权限,o权限

2-10位的权限总和有时称为a权限

以上例子中,表示这是一个文件(非目录),文件所有者具有读、写和执行的权限,所属组的用户和其他用户具有读和执行的权限而没有写的权限。

用数字表示法修改权限

所谓数字表示法,是指将r、w和x分别用4、2、1来代表,没有授予权限的则为0,

然后把权限相加,如下

原始权限 转换为数字 数字表示法

rwxrwxr-x (421)(421)(401) 775

rwxr-xr-x (421)(401)(401) 755

判断用户对一个文件的权限是这样的:

1、如果用户是文件所有者,则只按"u权限"判定,不考虑以下条件

2、如果用户在文件所属组的用户列表里,则只按"g权限"判定,不考虑以下条件

3、如果不满足以上两点,这只按"o权限"判定

现在给出当前系统中的所有用户以及用户所属的组。并且给出一些文件的信息。

请帮kk解决每个用户对每个文件的权限,用数字表示显示。

Input

第一行一个T,表示有T组数据

对于每组数据

第一行一个n表示有n个用户。接着n行,每行格式为

username n1 groupname_1 groupname_2 ... groupname_n1

表示用户username属于n1个组,接着为每个组名

接着输入一个m,表示有m个文件。接着给出每个文件的信息,格式为

filename xxx user group

表示文件名、权限、所属用户和所属组

0<n,m<=100,组名种数也小于100,所有字符串长度小于10.

Output

对于每组数据

输出一个n*m的矩阵,表示每个用户对每个文件的权限。数字间用空格隔开。

Sample Input

2

2

AA 2 AA BB

BB 1 BB

3

a 755 AA AA

b 644 BB BB

c 640 BB CC

1

AA 2 AA BB

1

a 755 CC AA

Sample Output

7 4 0

5 6 6

5

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2152

题目大意:中文题,如题

题目分析:按照题目意思模拟一下即可

#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
int const MAX = 105;

struct Info
{
    char user[15];
    int gnum;
    char g[15][15];
    int ans[100];
}a[MAX];

int main()
{
    int n, m, T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        for(int i = 0; i < n; i++)
        {
            scanf("%s %d", a[i].user, &a[i].gnum);
            for(int j = 0; j < a[i].gnum; j++)
                scanf("%s", a[i].g[j]);
        }
        scanf("%d", &m);
        char s[15], u[15], g[15], code[3];
        for(int i = 0; i < m; i++)
        {
            int cnt = 0;
            scanf("%s %s %s %s", s, code, u, g);
            for(int j = 0; j < n; j++)
            {
                if(strcmp(a[j].user, u) == 0)
                {
                    a[j].ans[i] = code[0] - '0';
                    continue;
                }
                else
                {
                    bool flag = false;
                    for(int k = 0; k < a[j].gnum; k++)
                    {
                        if(strcmp(a[j].g[k], g) == 0)
                        {
                            flag = true;
                            a[j].ans[i] = code[1] - '0';
                            break;
                        }
                    }
                    if(flag)
                        continue;
                }
                a[j].ans[i] = code[2] - '0';
            }
        }
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m - 1; j++)
                printf("%d ", a[i].ans[j]);
            printf("%d\n", a[i].ans[m - 1]);
        }
    }
}
时间: 2024-10-13 08:06:39

FZU 2152 文件系统 (小模拟)的相关文章

FZU2152 文件系统 小模拟

Description 每个Linux文件具有四种访问权限:可读(r).可写(w).可执行(x)和无权限(-). 利用ls -l命令可以看到某个文件或目录的权限,它以显示数据的第一个字段为准.第一个字段由10个字符组成,如下: -rwxr-xr-x 第1位表示文件类型,-表示文件,d表示目录 2-4位表示文件所有者的权限,u权限 5-7位表示文件所属组的成员的权限,g权限 8-10位表示所有者和所属组的成员之外的用户的权限,o权限 2-10位的权限总和有时称为a权限 以上例子中,表示这是一个文件

poj3087--Shuffle&#39;m Up(小模拟)

Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5983   Accepted: 2809 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of

【11.8校内测试】【倒计时2天】【状压DP】【随机化?/暴力小模拟】

Solution 数据范围疯狂暗示状压,可是一开始发现状态特别难受. 将每一层的奇偶性状压,预处理所有状态的奇偶性.每一层的输入代表的其实可以是下一层某个点可以被从这一层哪些点转移到. 所以枚举每个状态,再枚举下一层转移到哪个点,统计这个点被这个状态更新的话正边和反边分别的奇偶性,转移即可. 第二层和最后一层单独处理即可. Code #include<bits/stdc++.h> #define mod 998244353 using namespace std; int x, dp[2][(

用阿里云三个ECS服务器搭建一个小模拟Hadoop集群(三个不同账号的阿里云,相同区域或不同区域)步骤整理

检查hosts和网卡配置 把三台小服务器先做内网互通 内网互通参照阿里云安全通道配置 1.准备至少三个虚拟机 2.相互通信,生成密钥并发送 生成密钥(ssh-keygen -t rsa) 发送密钥ssh-copy-id [email protected] (需要先修改.etc\hosts 文件) 登录测试 ssh [email protected] 3.安装JDK和Hadoop jdk安装 上传jdk到vm1并解压(tar -zvxf jdk-7u67-linux-x64.tar.gz) 配置环

FZU 1893 内存管理 模拟

比赛的时候队友要做这道题…… 他没做出来自己也被误导了…… 也算是个教训 自己还是要有自己的思路…… 又是模拟题…… 网上都是用vector做的 我最近才会stl 怎么会用那么高大上的的东西…… 强力模拟一波内存…… 反正只有100的大小 随意遍历…… 模拟都做不出来 只能说明真的方了…… 只要心态稳定 模拟都是水题…… 1 #include<stdio.h> 2 #include<string.h> 3 int memory[102]; 4 int room[102]; 5 in

HDU 4814 Golden Radio Base 小模拟

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 题意:黄金比例切割点是,如今要求把一个10进制的的数转化成一个phi进制的数,而且不能出现'11'的情况. 思路:因为题目中给出了两个式子,题目就变成了一道简单的模拟题了.因为整个phi进制的数最多仅仅有200,而数据中最多仅仅有100位,所以从aa[50]=tot 開始模拟就可以. 代码: #include<iostream> #include<cstdio> #include&l

#个人赛第七场解题总结# (FZU 1881三角形问题 找规律 &amp;&amp;FZU 1884 排火车 模拟)

链接:click here~~ ,密码:nyist C - 三角形问题 Description 给你一个由无穷个节点组成的三角形(如下图),你的任务很简单--任意给你两个正整数x和y,判断它们是否相邻(重合不是相邻). Input 第一行T,表示T组测试数据,接下来仅有两个32位正整数x 和y. Output 对于每组测试数据,首先输出"Case k:",其中k表示第几组.然后如果x和y相邻,则输出"Yes",否则输出"No". Sample I

LeetCode #6 简单题(小模拟)

题目: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列.然后横向输出.LeetCode上有几个样例可以看看. 题解:模拟一下就好了- -,对原字符串s排列完后,横向每个添加到ans中去就行了 class Solution { public: string convert(string s, int numRows) { if (numRows == 1) return s; int len = (int)s.size(), gridSize = numRows * 2 -

FZU - 2159 - WuYou (模拟= =!)

Problem 2159 WuYou Accept: 78    Submit: 405 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 有两个正整数A和B,这两个数的位数相同且不含前缀0.A的一些位不能够确定,用'?'代替.已知A是满足 A < B 的最大的A.求A .  Input 第一行一个整数T(T<=1000),表示有T组数据. 每组数据两行,第一行为A,第二行为B(0 < A,B &l