201612-3 权限查询 模拟

传送门

CCF第三题, 同样是一道非常复杂度模拟题, 要非常细心不要漏掉哪一点.

可惜我只得了90分, 没得满分, 找不出那10分是错在哪里了.

贴下90分代码

#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
using namespace std;

void show(map<string, int> orig)
{
    map<string, int>::iterator im = orig.begin();
    while (im != orig.end()) {
        cout << im->first << " : " << im->second << endl;
        im++;
    }
}

int main()
{
    int p;
    cin >> p;
    string category;
    map<string, int> orig; // 保存所有的权限.(原始) 
    for (int i = 0, j; i < p; ++i) {
        cin >> category;
        j = category.size();
        if (category[j - 2] == ':') {
            string tmp;
            for (int k = 0; k < j - 2; ++k)
                tmp += category[k];
            orig[tmp] = category[j - 1] - '0';
        } else orig[category] = -1;
    }
    int r;
    cin >> r;
    string ident, categ;
    map<string, map<string, int> >man;
    for (int i = 0, num; i < r; ++i) {
        cin >> ident >> num;
        map<string, int> tmp;
        for (int j = 0; j < num; ++j) {
            cin >> categ;
            int t = categ.size();
            if (categ[t - 2] == ':') {
                string temp;
                for (int k = 0; k < t - 2; ++k)
                    temp += categ[k];
                tmp[temp] = categ[t - 1] - '0';
            } else tmp[categ] = -1;
        }
        man[ident] = tmp;
    }
    /*cout << "-----------------------------" << endl;
    map<string, map<string, int> >::iterator im = man.begin();
    while (im != man.end()) {
        cout << im->first << endl;
        show(im->second);
        cout << endl;
        im++;
    }*/
    int u, t;
    cin >> u;
    string name, job;
    map<string, vector<string> > user;
    for (int i = 0; i < u; ++i) {
        vector<string> tmp;
        cin >> name;
        cin >> t;
        for (int j = 0; j < t; ++j) {
            cin >> job;
            tmp.push_back(job);
        }
        user[name] = tmp;
    }
    /*cout << "----------------------------\n";
    map<string, vector<string> >::iterator iu = user.begin();
    while (iu != user.end()) {
        for (int i = 0; i < iu->second.size(); ++i) {
            cout << iu->second[i] << ' ';
        }
        cout << endl;
        iu++;
    }
    cout << "----------------------------\n";*/
    int q;
    cin >> q;
    for (int i = 0; i < q; ++i) {
        cin >> name >> categ;
        string cmd; // 权限名称 
        int level, l; // 权限等级 
        l = categ.size();
        if (categ[l - 2] != ':') cmd = categ, level = -1;
        else {
            for (int k = 0; k < l - 2; ++k)
                cmd += categ[k];
            level = categ[l - 1] - '0';
        }
        //cout << "name = " << name << "  cmd = " << cmd << endl;
        if (user.count(name) == 0 || orig.count(cmd) == 0) {
            cout << "false" << endl;
            continue;
        }
        vector<string> jobs = user[name];
        /*cout << "\n" << name << " : \n";
        for (int j = 0; j < jobs.size(); ++j) {
            cout << jobs[j] << endl;
        }*/
        //cout << "name = " << name << "  cmd = " << cmd << endl;
        if (level == -1) { // 查询本身没有等级 
            if (orig[cmd] == -1) { // 权限本身没有等级 
                //cout << "again name = " << name << " cmd = " << cmd << endl;
                bool flag = false; 
                for (int j = 0; j < jobs.size(); ++j) {
                    string jb = jobs[j]; // cao, 这里j写成i 
                    //cout << "jb = " << jb << endl;
                    map<string, int> now = man[jb];
                    if (now.count(cmd) == 1) flag = true;
                }
                if (flag) cout << "true" << endl;
                else cout << "false" << endl;
            } else { // 查询没有等级,但是实际上有等级 
                int lev = -1;
                for (int j = 0; j < jobs.size(); ++j) {
                    string jb = jobs[j];
                    map<string, int> now = man[jb];
                    if (now.count(cmd) == 1) {
                        lev = max(lev, now[cmd]);
                    }
                }
                if (lev == -1) {
                    cout << "false" << endl;
                } else cout << lev << endl;
            } 
        } else {
            int lev = -1;
            for (int j = 0; j < jobs.size(); ++j) {
                string jb = jobs[j];
                map<string, int> now = man[jb];
                if (now.count(cmd) == 1) {
                    lev = max(lev, now[cmd]);
                }
            }
            if (lev >= level && lev != -1) cout << "true" << endl;
            else cout << "false" << endl;
        }
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值