CSP认证202303-3:LDAP (超详细题解)

这篇具有很好参考价值的文章主要介绍了CSP认证202303-3:LDAP (超详细题解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目传送门

解题思路

最后要求输出符合条件的用户 DN 的集合, (作为一名STL战士) ,可以考虑维护以属性名和属性值为索引, 对应值为符合条件的用户的set 的一个map

属性名 -> 属性值 -> {用户1,用户2…}

unordered_map<int,unordered_map<int,set<int>>> attrName_attrVal_users;

操作分为原子操作和逻辑操作, 只需要判断字符串的首字符即可区分两种操作

原子操作

原子操作分为匹配和剔除, 匹配满足条件(属性名为相应属性值)的用户集合可以直接从刚才的map里找到, 作为答案, 而剔除时需要注意, 只有当用户该属性有值且不为指定值时才能作为答案, 所以为了便于判断用户指定属性是否有值(不为N/A), 可以维护一个以属性名为索引, 值为相应用户集合的map

属性名 -> {用户1,用户2…}

unordered_map<int, set<int>> attrName_users;
逻辑组合

逻辑操作主要是符合条件的用户集合的交和并, 以及逻辑操作的嵌套, 这里用两个set ans1ans2 来暂存符合条件的用户

交: 将两个集合插入另一个集合即可
ans.insert(ans1.begin(), ans1.end());
ans.insert(ans2.begin(), ans2.end());
并: 枚举一个集合, 判断每个元素在不在另一个集合中即可
for(auto it : ans1) {
	if(ans2.count(it)) {
		ans.insert(it);
	}
}
嵌套: 括号匹配

对于一个逻辑操作表达式的前后两个部分, 我们发现他们无论怎么嵌套, 每个部分的括号一定是匹配的, 可以维护一个括号栈, 遍历字符串直到括号栈空, 此时字符串的位置 (本文为p) 为前后两个部分的分界位置

然后递归调用即可

CSP认证202303-3:LDAP (超详细题解)文章来源地址https://www.toymoban.com/news/detail-448310.html

完整代码

#include<bits/stdc++.h>
using namespace std;

int n;
unordered_map<int,unordered_map<int,set<int>>> attrName_attrVal_users; // 存储 属性名-属性值-用户DN 
unordered_map<int, set<int>> attrName_users; // 存储该属性不为NA的用户DN set 

int getNum(string exp) {// 字符串转整形 
	int ans = 0;
	for(int i = 0; i < exp.size(); i++) {
		ans *= 10;
		ans += (exp[i] - '0');
	}
	return ans;
}

set<int> AtomOP(string exp) {// 原子操作 
	int p = 0;set<int> ans;
	while(exp[p] != ':' && exp[p] != '~') p++;
	int a = getNum(exp.substr(0,p));
	int b = getNum(exp.substr(p+1, exp.size()));
	if(exp[p] == ':') {
		ans.insert(attrName_attrVal_users[a][b].begin(), attrName_attrVal_users[a][b].end());
	}
	else {
		ans.insert(attrName_users[a].begin(), attrName_users[a].end());
		set<int> dead;
		for(auto it : attrName_attrVal_users[a][b]) {
			if(ans.count(it)) {
				dead.insert(it);
			}
		}
		for(auto it : dead) ans.erase(it);
	}
	return ans;
}

set<int> ExprOP(string exp) { 
	set<int> ans;
	if(exp[0] >= '0' && exp[0] <= '9') {
		ans = AtomOP(exp);
	}
	else if(exp[0] == '&') {
		int p = 1;set<int> ans1;set<int> ans2;
		stack<char> br;br.push('(');
		while(!br.empty()) {
			p++;
			if(exp[p] == '(') {
				br.push('(');
			}
			else if(exp[p] == ')') {
				br.pop();
			}
		}
		ans1 = ExprOP(exp.substr(2, p-2));
		
		int q = p+2;br.push('(');
		while(!br.empty()) {
			q++;
			if(exp[q] == '(') {
				br.push('(');
			}
			else if(exp[q] == ')') {
				br.pop();
			}
		}
		ans2 = ExprOP(exp.substr(p+2, q-p-2));
		for(auto it : ans1) {
			if(ans2.count(it)) {
				ans.insert(it);
			}
		}
	}
	else if(exp[0] == '|') {
		int p = 1;set<int> ans1;set<int> ans2;
		stack<char> br;br.push('(');
		while(!br.empty()) {
			p++;
			if(exp[p] == '(') {
				br.push('(');
			}
			else if(exp[p] == ')') {
				br.pop();
			}
		}
		ans1 = ExprOP(exp.substr(2, p-2));
		int q = p+2;br.push('(');
		while(!br.empty()) {
			q++;
			if(exp[q] == '(') {
				br.push('(');
			}
			else if(exp[q] == ')') {
				br.pop();
			}
		}
		ans2 = ExprOP(exp.substr(p+2, q-p-2));
		
		ans.insert(ans1.begin(), ans1.end());
		ans.insert(ans2.begin(), ans2.end());
	}
	return ans;
}


int main() {
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin >> n;
	for(int i = 1; i <= n; i++) {
		int dn;cin >> dn;
		int num;cin >> num;
		users.insert(dn);
		for(int j = 1; j <= num; j++) {
			int attrName;cin >> attrName;
			int attrVal; cin >> attrVal;
			attrName_attrVal_users[attrName][attrVal].insert(dn);
			attrName_users[attrName].insert(dn);
		}
	}
	int m;
	cin >> m;
	for(int i = 1; i <= m; i++) {
		string exp;cin >> exp;
		set<int> ans;
		ans = ExprOP(exp);
		for(auto it : ans) {
			cout << it << " ";
		}
		cout << endl;
	}
	return 0;
}

到了这里,关于CSP认证202303-3:LDAP (超详细题解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CCF-CSP历年真题大全附题解(202303已更)

             各位朋友,历年的题目你们要是有不同的解法想和大家进行分享的,可以私聊我发我题目编号和代码,我也可以更新到文章中,给需要的朋友多点参考~~           CCF-CSP真题拿来练手,持续更新,CCF-CSP真题拿来练手,如果对自己没有拿高分的期望的话,可以就

    2024年02月01日
    浏览(69)
  • CCF- CSP 202303-2垦田计划 【多种方法】满分题解

    CCF- CSP 202303-2垦田计划 【多种方法】满分题解 题目链接:CCF- CSP 202303-2垦田计划 70分思路: 从基础耗时最长的区域进行筛选,每次基础耗时减少一天 该方法以 m 作为参考对象,对 m 进行减的操作( m 的数据范围达到 1e9 ,导致超时) 采用 优先队列 作为存储结构,同时存储 t 和

    2024年02月01日
    浏览(72)
  • CCF-CSP真题《202303-5 施肥》思路+python,c++满分题解

    想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号: 202303-5 试题名称: 施肥 时间限制: 2.0s 内存限制: 1.0GB 问题描述: 春天到了,西西艾弗岛上的 n 块田地需要施肥了。n 块田地编号为 1,2,⋯,n,按照编号从小到大的顺序排成一列。 为了给

    2024年02月09日
    浏览(43)
  • CCF-CSP真题《202303-1 田地丈量》思路+python,c++满分题解

    想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号: 202303-1 试题名称: 田地丈量 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 西西艾弗岛上散落着 n 块田地。每块田地可视为平面直角坐标系下的一块矩形区域,由左下角坐标 (x1,y1) 和右上角

    2024年02月12日
    浏览(112)
  • CCF-CSP真题《202303-2 垦田计划》思路+python,c++满分题解

    想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号: 202303-2 试题名称: 垦田计划 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 顿顿总共选中了 n 块区域准备开垦田地,由于各块区域大小不一,开垦所需时间也不尽相同。据估算,其中第 i 块

    2024年02月12日
    浏览(41)
  • CCF-CSP真题《202303-1 田地丈量》思路+python,c++,java满分题解

    想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号: 202303-1 试题名称: 田地丈量 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 西西艾弗岛上散落着 n 块田地。每块田地可视为平面直角坐标系下的一块矩形区域,由左下角坐标 (x1,y1) 和右上角

    2024年02月09日
    浏览(35)
  • 2023CSP-CCF前三题 田地丈量、垦田计划、LDAP解题分析

    2023.03第29次CCF-CSP计算机认证考试 CCF计算机软件能力认证考试系统 大二菜鸟第一次参加CSP考试,发挥得很烂( 其实是实力太菜了 ),考前也没看往年题目套路,有很多不甘吧,不过拟打算六月再参加一次。如果早知道题目难度是依次递增的,就不写完两题就去啃最后一题了

    2024年02月05日
    浏览(31)
  • 【ccf-csp题解】第四次csp认证-第四题-网络延时-树的直径

    本题所求的实际上是树的直径,即树中的任意两个结点之间的最大距离 采用的方法是dfs 从根节点开始遍历,对于每一个被dfs的结点m,返回此结点m到所有叶子结点的距离最大的那个即d1,同时在dfs过程当中记录结点m到所有叶子结点的距离第二大的那个,即d2 那么最终答案就是

    2024年02月09日
    浏览(25)
  • CCF CSP认证最新2022-12题解c++(全网首发)

    第一次写题解,代码没带注释,请谅解,尽力在题目分析中说明白. http://118.190.20.162/view.page?gpid=T160 问题描述 输入格式 输出格式 输出到标准输出中。 输出一个实数,表示该项目在当前价值标准下的总盈利或亏损。 题目分析 按照题意将除第一年外的每年x元都转换为当前的实际价

    2024年02月13日
    浏览(33)
  • csp-j/s模拟题详细题解

    题目描述 一天小理买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着小理发现瓶子实在太多了,于是他决定保留不超过K个瓶子,每次他选择两个当前含水量相同的瓶子合并。(即把一个瓶子的水全部倒进另一个里然后把空瓶丢弃) (注:不能丢弃有水

    2024年02月10日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包