当前位置:   article > 正文

CSP 202303-3 LDAP_ldapcsp

ldapcsp

一开始是没有attrUsers这个map的,于是在retBasicExprSet函数中如果是”:"就要遍历整个mapper,这会比较费时,于是就t了,加了这个小优化就可以过了,但是还是用时比较长。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. unordered_map<int,map<int,set<int>>>mapper;
  4. unordered_map<int,set<int>> attrUsers;
  5. int n,m;
  6. set<int> retBasicExprSet(const string& exp) {
  7. int p = 0;set<int> ans;
  8. while(exp[p] != ':' && exp[p] != '~') p++;
  9. int a = atoi(exp.substr(0,p).c_str());
  10. int b = atoi(exp.substr(p+1, exp.size()).c_str());
  11. if(exp[p] == ':') {
  12. ans.insert(mapper[a][b].begin(), mapper[a][b].end());
  13. }
  14. else {
  15. ans.insert(attrUsers[a].begin(), attrUsers[a].end());
  16. set<int> dead;
  17. for(auto it : mapper[a][b]) {
  18. if(ans.count(it)) {
  19. dead.insert(it);
  20. }
  21. }
  22. for(auto it : dead) ans.erase(it);
  23. }
  24. return ans;
  25. }
  26. set<int> retComplexExprSet(const string& str) {
  27. stack<int>stk;
  28. char firChar = str[0];
  29. if(firChar != '&' && firChar != '|') return retBasicExprSet(str);
  30. set<int> ret;
  31. int lasPos = 2;
  32. bool upd = false;
  33. for(int i = 1; i < str.size(); i++) {
  34. if(str[i] == '(') stk.push('(');
  35. if(str[i] == ')') stk.pop();
  36. if(stk.empty()) {
  37. set<int> st = retComplexExprSet(str.substr(lasPos,i - lasPos));
  38. lasPos = i + 2;
  39. if(!upd) {
  40. upd = true; ret = st;
  41. continue;
  42. }
  43. upd = true;
  44. if(firChar == '&') {
  45. set<int>tmp;
  46. for(auto& val:st) {
  47. if(ret.count(val)) tmp.insert(val);
  48. }
  49. ret = tmp;
  50. } else {
  51. ret.insert(st.begin(), st.end());
  52. }
  53. }
  54. }
  55. return ret;
  56. }
  57. void solve(const string& str) {
  58. set<int> res = retComplexExprSet(str);
  59. for(auto dn: res) {
  60. cout << dn << ' ';
  61. }
  62. cout << '\n';
  63. }
  64. int main() {
  65. std::ios::sync_with_stdio(false);
  66. cin.tie(0);
  67. cout.tie(0);
  68. cin >> n;
  69. for(int i = 1; i <= n; i++) {
  70. int DN; cin >> DN;
  71. int totNum; cin >> totNum;
  72. for(int j = 1; j <= totNum; j++) {
  73. int k,v; cin >> k >> v;
  74. mapper[k][v].insert(DN);
  75. attrUsers[k].insert(DN);
  76. }
  77. }
  78. cin >> m;
  79. for(int i = 1; i <= m; i++) {
  80. string str;
  81. cin >> str;
  82. solve(str);
  83. }
  84. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/215706
推荐阅读
相关标签
  

闽ICP备14008679号