题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2723
题目大意:
对一个文件进行访问控制,对每个文件建立一个访问控制表ACT,ACT有很多的用户组entities,
每个用户都有一定的访问权利。文件还有权限修改日志。形式为ExR,E是用户(可能是多个),R是
权限,x是操作,可以是+(把权限加到用户上)、-(从用户上减去权限)、=(给用户设置相应权限)。
最后输出每个用户对应的权限。没有权限则不输出,相邻的用户有相同的权限,则一起合并,然后
输出。
思路:
用数组ACT[]来存用户组,Map[][]来存用户和权限的对应关系。模拟写一遍就可以了。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
char s[110],temp[110];
int ACL[27],Map[70][70],ans[70];
int main()
{
int kase = 0;
while(cin >> s && strcmp(s,"#"))
{
int len = strlen(s);
int len1 = 0;
memset(Map,0,sizeof(Map));
for(int i = 0; i < len; ++i)
{
if(s[i]==',')
{
memset(temp,0,sizeof(temp));
len1 = 0;
}
else if(s[i]=='+')
{
for(int j = i+1; s[j]!=',' && j < len; ++j)
for(int k = 0; k < len1; ++k)
Map[temp[k]-'A'][s[j]-'a'] = 1;
}
else if(s[i]=='-')
{
for(int j = i+1; s[j]!=',' && j < len; ++j)
for(int k = 0; k < len1; ++k)
Map[temp[k]-'A'][s[j]-'a'] = 0;
}
else if(s[i]=='=')
{
for(int k = 0; k < len1; ++k)
{
memset(Map[temp[k]-'A'],0,sizeof(Map[0]));
for(int j = i+1; s[j]!=',' && j < len; ++j)
Map[temp[k]-'A'][s[j]-'a'] = 1;
}
}
else
temp[len1++] = s[i];
}
cout << ++kase << ':';
int No = 0,flag;
for(int i = 0; i < 26; ++i)
{
flag = 1;
for(int j = 0; j < 26; ++j)
{
if(Map[i][j])
flag = 0;
}
if(!flag)
ans[No++] = i;
}
memset(temp,0,sizeof(temp));
len1 = 0;
for(int i = 0; i < No; ++i)
{
int flag = 0;
if(i != No-1)
{
for(int j = 0; j < 26; ++j)
{
if(Map[ans[i]][j] != Map[ans[i+1]][j])
flag = 1;
}
}
temp[len1++] = 'A' + ans[i];
if(flag == 1 || i == No-1)
{
for(int j = 0; j < len1; ++j)
cout << temp[j];
memset(temp,0,sizeof(temp));
len1 = 0;
for(int j = 0; j < 26; ++j)
if(Map[ans[i]][j])
cout << (char)(j+'a');
}
}
cout << endl;
memset(s,0,sizeof(s));
}
return 0;
}