CCF 201612-3 权限查询

来源:互联网 发布:专用抢红包软件 编辑:程序博客网 时间:2024/05/16 06:17
虽然写的时候觉得很烦,但竟然一次性过了。这道题主要是在决定用什么方式存储每种角色所拥有的权限和每个用户所拥有的角色上比较纠结,由于题目明确表示后面所有权限都只会在P段中出现,所以P段数据对这道题其实是可有可无的,直接用getline处理掉即可。本来打算用结构体,将每个角色的所有权限都作为一个角色的所有属性,对每个用户的所有角色也同样处理,但觉得这样每次找对应的权限都要循环遍历,比较麻烦,最终使用了嵌套的map。使用map<string,vector<Privilege> >实现角色到权限的映射(后来觉得用map<string, map<string,int> >好像更好,但懒得改了),使用map<string,map<string, int> >实现用户名到权限的映射,第二个本来是想通过用户名到角色的映射的,但注意到查询操作中,只需要通过用户名查找权限,因此可以直接把角色信息忽略。在使用string的find函数时要注意找不到时是返回string::npos(虽然知道,但做题时还是可能一不小心以为返回值是true和false),还有一个就是,**引用真的超好用的**,好多地方都通过引用简化代码,但对于结构体中含有指针或数组时使用引用有时会出错,不知道为什么。
#include<iostream>#include<algorithm>#include<map>#include<string>#include<vector>using namespace std;const int max_pru = 100;struct Privilege{    string privilege_name;    int level;    Privilege(string p, int l):privilege_name(p),level(l){} };map<string,vector<Privilege> > r_t_p;map<string,map<string, int> > u_t_p;void show_r_t_p(){    map<string, vector<Privilege> >::iterator mit;    for(mit = r_t_p.begin(); mit != r_t_p.end(); mit++)    {        cout << mit->first << "---> ";        vector<Privilege> &v = mit->second;        for(int i = 0; i < v.size(); i++)        {            cout << v[i].privilege_name << ":" << v[i].level << " ";        }        cout << endl;    }}void show_u_t_p(){    map<string, map<string, int> >::iterator it1;    for(it1=u_t_p.begin(); it1!=u_t_p.end(); it1++)    {        cout << it1->first << "----> ";        map<string, int>& m = it1->second;        map<string, int>::iterator it2;        for(it2=m.begin(); it2!=m.end(); it2++)        {            cout << it2->first << ":" << it2->second << " ";            }           cout << endl;    }   }int main(){    int p;    cin >> p;    getchar();    for(int i = 0; i < p; i++)    {        string priv;        getline(cin, priv);    }    int r;    cin >> r;    for(int i = 0; i < r; i++)    {        string role;        string priv;        int p_num;        cin >> role >> p_num;        for(int j = 0; j < p_num; j++)        {            cin >> priv;            if(priv.find(":")==string::npos)            {                r_t_p[role].push_back(Privilege(priv, -1));            }else            {                string pre_priv = priv.substr(0, priv.length()-2);                int level = priv[priv.length()-1]-'0';                r_t_p[role].push_back(Privilege(pre_priv, level));            }        }    }//for(i)//  show_r_t_p();    int u;    cin >> u;    for(int i = 0; i < u; i++)    {        string user;        int r_n;        cin >> user >> r_n;        for(int j = 0; j < r_n; j++)        {            string role;            cin >> role;            vector<Privilege> &v = r_t_p[role];            for(int k = 0; k < v.size(); k++)            {                map<string, int> &m = u_t_p[user];                if(m.count(v[k].privilege_name))                {                    int one = v[k].level;                    int second = m[v[k].privilege_name];                    m[v[k].privilege_name]= max(one, second);                   }else                {                    m[v[k].privilege_name] = v[k].level;                    }               }           }       }//  show_u_t_p();    int q;    cin >> q;    for(int i = 0; i < q; i++)    {        string user;        cin >> user;        string priv;        cin >> priv;        if(!u_t_p.count(user))            cout << "false\n";        else        {            map<string, int> &m = u_t_p[user];//          if(priv.find(":")!=string::npos)            if(priv[priv.length()-2]==':')            {//              cout << "**** " << priv << "找到:\n";                 string pre_priv = priv.substr(0, priv.length()-2);                int level = priv[priv.length()-1]-'0';                if(!m.count(pre_priv))                    cout << "false\n";                else                {                    if(level<=m[pre_priv])                        cout << "true\n";                    else                        cout << "false\n";                }            }else            {//              cout << "*******user = " << user << " " << "priv = " << priv << endl;                if(!m.count(priv))                    cout << "false\n";                else                {                    if(m[priv]==-1)                        cout << "true\n";                    else                    {                        cout << m[priv] << "\n";                    }                }            }        }    }}
原创粉丝点击