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
Sample Output
這個題目還是很簡單的。其實看懂題目就超級水。
雖然樣例中文件名就一個字母,但實際上其他樣例是有其他字母組成的。
#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;
}