fzu Problem 2152 文件系統

Problem 2152 文件系統

Accept: 37    Submit: 73
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

22AA 2 AA BBBB 1 BB3a 755 AA AAb 644 BB BBc 640 BB CC1AA 2 AA BB1a 755 CC AA

Sample Output

7 4 05 6 65



這個題目還是很簡單的。其實看懂題目就超級水。

雖然樣例中文件名就一個字母,但實際上其他樣例是有其他字母組成的。



#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
    string as;//user
    int d;
    string bs[110];//group

}unit[150];
struct na
{
    string sa;
    char sb[12];
    int d1,d2,d3;
    string a,b;
    //a uesr b  group

}ua[150];

int judge(int e,int f)
{
    int i,j;
    //cout<<unit[e].d<<"   ttttt    "<<endl;
    for(i=0;i<unit[e].d;i++)
    {
       // cout<<unit[e].bs[i]<<" gg "<<endl;
        //cout<<"hhhhh    "<<ua[f].b<<endl;
        if(unit[e].bs[i]==ua[f].b)
        {
            return 1;
        }


    }
    return 0;

}

int main()
{

    int i,j,k,l;
    int T,n,m;
    scanf("%d",&T);
    while(T--)
    {

     scanf("%d",&n);
     for(i=0;i<n;i++)
     {
         cin>>unit[i].as;
         cin>>unit[i].d;
         for(j=0;j<unit[i].d;j++)
         {
             cin>>unit[i].bs[j];
         }
     }
     scanf("%d",&m);
     for(i=0;i<m;i++)
     {
         cin>>ua[i].sa>>ua[i].sb>>ua[i].a>>ua[i].b;
         ua[i].d1=ua[i].sb[0]-'0';
         ua[i].d2=ua[i].sb[1]-'0';
         ua[i].d3=ua[i].sb[2]-'0';
     }
    /* for(i=0;i<unit[0].d;i++)
     {
         cout<<unit[0].bs[i]<<" ttttttttttt "<<endl;
     }
     for(i=0;i<m;i++)
     {
         cout<<ua[i].sa<<" "<<ua[i].d1<<" "<<ua[i].d2<<" "<<ua[i].d3<<" "<<ua[i].a<<" "<<ua[i].b<<endl;
     }*/
     for(i=0;i<n;i++)
     {
         for(j=0;j<m;j++)
         {
             if(unit[i].as==ua[j].a)
             {
                // printf("aaaaaa\n");
              if(j==0)
              {
                  printf("%d",ua[j].d1);
              }
              else
              {
                  printf(" %d",ua[j].d1);
              }

             }
             else
             if(judge(i,j))
             {
               //  printf("bbbbbb\n");
                 if(j==0)
                 {
                   printf("%d",ua[j].d2);
                 }
                 else
                {
                  printf(" %d",ua[j].d2);
                }

             }
             else
             {
                //  printf("ccccc\n");
                  if(j==0)
                 {
                   printf("%d",ua[j].d3);
                 }
                 else
                {
                  printf(" %d",ua[j].d3);
                }

             }

         }
         printf("\n");


     }









    }
    return 0;
}







發佈了312 篇原創文章 · 獲贊 10 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章