• foj 文件系统 stl string + vector 多对多的数据结构


    题目来源:http://acm.fzu.edu.cn/contest/problem.php?cid=135&sortid=1

     Problem A 文件系统

    Accept: 56    Submit: 130
    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

     分析:

    vector<string>List[N]

    1:每个向量存储一个用户信息list[n][0] 以及 它所在的组的信息。 这样就实现了 多对多的关系。

    2:stl 中 标准库类型string 对象中有许多操作。 这里我们用到了 s1=s2 ,直接判断两个字符串是否相等。

    代码如下:

    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    #include <iostream>
    #include <vector>
    using namespace std;
    typedef long long ll;
    #define N 105
    vector<string>List[N];
    int n,m;
    struct Node
    {
        string name;
        string num;
        string user;
        string group;
        void read()
        {
            cin>>name>>num>>user>>group;
        }
    };
    Node node[N];
    int ans[N][N];
    int main() {
        string s;
        int t,c;
        cin>>t;
       while(t--)
       {
           cin>>n;
           for(int i=1;i<=n;i++)
                List[i].clear();
           for(int i=1;i<=n;i++)
           {
               cin>>s;
               List[i].push_back(s);
               cin>>c;
               while(c--)
               {
                   cin>>s;
                   List[i].push_back(s);
               }
           }
           cin>>m;
           for(int i=1;i<=m;i++)
           {
               node[i].read();
           }
           memset(ans,-1,sizeof(ans));
           for(int i=1;i<=n;i++)
           {
               for(int j=1;j<=m;j++)
               {
                   if(node[j].user == List[i][0])
                   {
                       ans[i][j]=node[j].num[0]-'0';
                       continue;
                   }
                   else
                   {
                       for(int k=1;k<List[i].size(); k++)
                       {
                           if(List[i][k]==node[j].group)
                           {
                               ans[i][j]= node[j].num[1]-'0';
                               break;
                           }
                       }
                       if(ans[i][j]==-1)
                        ans[i][j]=node[j].num[2]-'0';
                   }
               }
           }
           for(int i=1;i<=n;i++)
           {
                for(int j=1;j<=m;j++)
                {
                    if(j==1) printf("%d",ans[i][j]);
                    else printf(" %d",ans[i][j]);
                }
            printf("
    ");
           }
       }
        return 0;
    }
  • 相关阅读:
    CodeForces Gym 100500A A. Poetry Challenge DFS
    CDOJ 486 Good Morning 傻逼题
    CDOJ 483 Data Structure Problem DFS
    CDOJ 482 Charitable Exchange bfs
    CDOJ 481 Apparent Magnitude 水题
    Codeforces Gym 100637G G. #TheDress 暴力
    Gym 100637F F. The Pool for Lucky Ones 暴力
    Codeforces Gym 100637B B. Lunch 找规律
    Codeforces Gym 100637A A. Nano alarm-clocks 前缀和
    TC SRM 663 div2 B AABB 逆推
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3619198.html
Copyright © 2020-2023  润新知