csp201612-3 权限查询

思路解析

有点难受,这道题在CSP官网过了,但是在acwing上面没过。

2744728 魏子尧 魏子尧 权限查询 10-06 21:16 1.835KB CPP14 正确 100 109ms 3.152MB

写这道题的时候想着肯定不能遍历查询(遍历权限查询其实也能过)

所以map的结构是:

map<人名, 结构体{set<所有权限名>; map<带等级的权限名, 权限等级>}>

这样在查找的时候,可以先查询set中的所有权限名, 再去进行是否带有等级的分类讨论。

代码

include

include

include

include

using namespace std;

map<string, vector> rl_mp;

class person {
public:
set st;
map<string, int> grds;
string name;
};

map<string, person> ps_mp;

int main() {
int p; cin >> p;
for (int i = 0; i < p; i++) {
string cate; cin >> cate;
}

int r; cin >> r;
for (int i = 0; i < r; i++) {
string rl; cin >> rl;
int j; cin >> j;
vector vec;
while (j--) {
string cate; cin >> cate;
vec.push_back(cate);
}

rl_mp.emplace(rl, vec);
}

int u; cin >> u;
for (int i = 0; i < u; i++) {
string name; cin >> name;
int cnt; cin >> cnt;
person p1;
while (cnt--) {
string str; cin >> str;
vector n = rl_mp.at(str);
for (auto& v : n) {
if (v[v.size() - 2] == '😂 {
int g = v[v.size() - 1] - '0';
string sub = v.substr(0, v.size() - 2);
if (p1.grds.find(sub) != p1.grds.end()) {
if (p1.grds.at(sub) < g) {
p1.grds[sub] = g;
}
}
else p1.grds.emplace(sub, g);
p1.st.insert(sub);
}
else p1.st.insert(v);
}
}

ps_mp.emplace(name, p1);
}

int q; cin >> q;
while (q--) {
string name; cin >> name;
if (ps_mp.find(name) == ps_mp.end()) {
cout << "false" << endl;
continue;
}
person p1 = ps_mp.at(name);
string qry; cin >> qry;
if (qry[qry.size() - 2] == '😂 {
int g = qry[qry.size() - 1] - '0';
string sub = qry.substr(0, qry.size() - 2);
if (p1.grds.find(sub) != p1.grds.end() && p1.grds[sub] >= g) {
cout << "true";
}
else cout << "false";
cout << endl;
continue;
}
else {
if (p1.st.find(qry) != p1.st.end() && p1.grds.find(qry) == p1.grds.end()) {
cout << "true" << endl;
continue;
}
else {
if (p1.st.find(qry) == p1.st.end()) cout << "false";
else cout << p1.grds[qry];
cout << endl;
}
}
}
return 0;
}