题目太长我就不截图了,昨天晚上写了这道题,写了100行,只给了20分,不得不说,总感觉自己能拿到满分,但就是不知道哪里错了,改了一会儿,依然是20.后来,找了一个答案,不得不说写的太好了,很清楚,大概大佬就是如此吧,同样100行,我20大佬100,看了大佬代码后,有很多收获,所以在此记录一下。
1.代码逻辑有问题
其中有个功能要求实现判断某个用户,能不能做某个操作,我的逻辑和题正好相反,虽然它没错,但是浪费了时间,最主要是和题意相反。多做了一些无意义的事情。
2.事无巨细,全结构体
我第一次做这种大模拟题,生怕有的信息会漏掉,就用了很多结构体,无形之中就复杂了这个过程,虽然有c++的stl帮忙,但还是结果不尽人意,所以说,这种题还得练练,把思路和逻辑想清楚,才能更快更好的做出这些问题。
- #include
- #include
- #include
- using namespace std;
-
- const int N = 510;
- int n, m, q; //角色数量,角色关联数量,待检测操作数量
-
- struct Role { //character
- string name;
- int nv, no, nn;//操作集合 资源种类集合 资源名称集合
- unordered_map
int> op; - unordered_map
int> type; - unordered_map
int> source; - }role[N];
-
- unordered_map
int> roletoid; - unordered_map
int> > usertoid; - unordered_map
int> > grouptoid; -
- bool check(int id, string o, string t, string s)
- {
- if (role[id].op.count(o) == 0 && role[id].op.count("*") == 0) return false;
- if (role[id].type.count(t) == 0 && role[id].type.count("*") == 0) return false;
- if (role[id].source.count(s) == 0 && role[id].nn != 0) return false;
- return true;
- }
-
- int main()
- {
- cin >> n >> m >> q;
- for (int i = 0; i < n; i++) //输入每个角色的信息
- {
- cin >> role[i].name;
- roletoid[role[i].name] = i;
-
- string t; int m;
- cin >> m;
- for (int j = 0; j < m; j++)
- {
- cin >> t;
- role[i].op[t] = 1;
- }
- cin >> m;
- for (int j = 0; j < m; j++)
- {
- cin >> t;
- role[i].type[t] = 1;
- }
- cin >> role[i].nn;
- for (int j = 0; j < role[i].nn; j++)
- {
- cin >> t;
- role[i].source[t] = 1;
- }
- }
-
- for (int i = 0; i < m; i++) //输入每个角色关联的信息
- {
- string s; cin >> s; //角色名称
- int id = roletoid[s];
-
- int m; cin >> m;
- for (int j = 0; j < m; j++)
- {
- char t; cin >> t;
- string name; cin >> name;
- if (t == 'u')
- usertoid[name].push_back(id);
- else
- grouptoid[name].push_back(id);
- }
- }
-
- for (int i = 0; i < q; i++)
- {
- string un; cin >> un; //用户名称
- int ng; cin >> ng;
- string ugroup[N];
- for (int j = 0; j < ng; j++) cin >> ugroup[j];
-
- string op, type, source;
- cin >> op >> type >> source;
-
- bool flag = false;
- for (int id : usertoid[un])
- if (check(id, op, type, source))
- flag = true;
-
- if (!flag)
- {
- for (int j = 0; j < ng; j++)
- for (int id : grouptoid[ugroup[j]])
- if (check(id, op, type, source))
- flag = true;
- }
- if (flag) cout << 1 << endl;
- else cout << 0 << endl;
- }
- return 0;
- }