HDU2723 Electronic Document Security【字符串】【水题】

来源:互联网 发布:喜马拉雅有mac版吗 编辑:程序博客网 时间:2024/05/19 14:37

题目链接:

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;}



0 0
原创粉丝点击