CCF-CSP 29次 第三题【202303-3 LDAP】

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

  • 数据结构:结构体数组、哈希表
  • struct User
    {
    	int DN; // 存储用户标号 
    	unordered_map<LL, LL> attr // 哈希表存储属性和值;
    }user[N];
    
  • 原子表达式:处理很简单,利用string中的find()函数找到:~的位置下标,左边为key,右边为value,遍历结构体数组寻找匹配的用户。
  • 表达式的逻辑组合:&(...)(...)括号内也可以是逻辑组合,如&(|(1:2)(3~4))(101:202)。注意不会出现&(...)(...)(...)这种情况。处理思路是对于&(...)(...)提取左右括号内的字串,并递归求解。
  • 更多实现的细节请见代码中注释。

官网运行截图如下,本来是奔着解决前40分的,没想到拿到了100分,但由于非常暴力,运行时间10s了。
CCF-CSP 29次 第三题【202303-3 LDAP】文章来源地址https://www.toymoban.com/news/detail-459429.html

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <string>
 
using namespace std;

typedef long long LL;

const int N = 2510, M = 510;

int n, m;

struct User
{
	int DN;
	unordered_map<LL, LL> attr;
}user[N];

// 原子操作 
vector<int> match(string str)
{
	vector<int> res;
	if (str.find(":") != -1)
	{
		int loc = str.find(":");
		
		auto key = str.substr(0, loc);
		auto value = str.substr(loc + 1, str.size() - loc - 1);
		
		// str to int	
		int k = stoi(key);
		int v = stoi(value);
		
		for (int i = 0; i < n; i ++ )
		{
			if (user[i].attr.count(k))
				if (user[i].attr[k] == v)
					res.push_back(user[i].DN);
		}
		
		sort(res.begin(), res.end());
	}
	
	else if (str.find('~') != -1)
	{
		int loc = str.find('~');
		auto key = str.substr(0, loc);
		auto value = str.substr(loc + 1, str.size() - loc - 1);
		
		// str to int	
		int k = stoi(key);
		int v = stoi(value);
		
		for (int i = 0; i < n; i ++ )
		{
			if (user[i].attr.count(k))
				if (user[i].attr[k] != v)
					res.push_back(user[i].DN);
		}
		
		sort(res.begin(), res.end());
	}
	
	return res;
}

vector<int> match2(string str)  // &(|(1:2)(3~4))(101:202)
{
	vector<int> res;
	
	// 匹配 1:2 
	if (str[0] > '0' && str[0] <= '9') 
		return match(str); 
	
	// 匹配 &(...)(...) 
	else
	{
		char c = str[0];
		str.erase(0, 1);
		
		// 当左右括号数量相同时,得到子表达式 
		int len = str.size();
		string s;
		int loc;
		for (int i = 1; i <= len; i ++ )
		{
			s = str.substr(0, i);
			if (count(s.begin(), s.end(), '(') == count(s.begin(), s.end(), ')'))
			{
				loc = i;
				break;
			}
		}
		
		string sub_l = str.substr(1, loc - 2); // 左边括号中字串 
		string sub_r = str.substr(loc + 1, str.size() - loc - 2); // 右边括号中字串 
		
		vector<int> res_l = match2(sub_l); // 递归调用 
		vector<int> res_r = match2(sub_r);
		
		if (c == '&')
		{					
			vector <int> v_intersection;
			// 取交集 
			set_intersection(res_l.begin(), res_l.end(),
				res_r.begin(), res_r.end(),
				back_inserter(v_intersection));	
			return v_intersection;

		}
		
		else if (c == '|')
		{
			vector <int> v_union;
			// 取并集 
			set_union(res_l.begin(), res_l.end(),
				res_r.begin(), res_r.end(),
				back_inserter(v_union));	
			return v_union;
		}
	}
}

int main()
{
	scanf("%d", &n);
	
	for (int i = 0; i < n; i ++ )
	{
		int DN, cnt;
		scanf("%d%d", &DN, &cnt);
		user[i].DN = DN;
		
		while (cnt -- )
		{
			LL a, v;
			scanf("%lld%lld", &a, &v);
			user[i].attr[a] = v;
		}
	}
	
	scanf("%d", &m);
	while (m -- )
	{
		string str;
		cin >> str;
		
		vector<int> res;
		res = match2(str);
		
		sort(res.begin(), res.end());
		if (res.size() == 0) cout << endl;
		else
		{
			for (auto i: res) cout << i << " "; 
			cout << endl;
		}
	}
	return 0;
}

/*
2
1 2 1 2 2 3
2 2 2 3 3 1 
5
1:2
3~1
&(1:2)(2:3)
|(1:2)(3:1)
&(|(1:2)(3~4))(101:202)
*/

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

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

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

相关文章

  • CCF-CSP认证 202303 500分题解

    202303-1 田地丈量(矩形面积交) 矩形面积交=x轴线段交长度*y轴线段交长度 线段交长度,相交的时候是min右端点-max左端点,不相交的时候是0 202303-2 垦田计划(二分) 二分最终答案x(x=k),判断降到x天资源是否够 够的话就往小里二分,否则往大里二分, 当然贪心也可以做

    2023年04月18日
    浏览(50)
  • CCF-CSP历年真题大全附题解(202303已更)

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

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

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

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

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

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

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

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

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

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

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

    2024年02月05日
    浏览(44)
  • 第29次CCF CSP 认证题目 第一题 202303-1 田地丈量 C++实现 满分答案

    西西艾弗岛上散落着 n 块田地。每块田地可视为平面直角坐标系下的一块矩形区域,由左下角坐标 (x1,y1) 和右上角坐标 (x2,y2) 唯一确定,且满足 x1x2、y1y2。这 n 块田地中,任意两块的交集面积均为 0,仅边界处可能有所重叠。 最近,顿顿想要在南山脚下开垦出一块面积

    2023年04月15日
    浏览(56)
  • CSP认证202303-3:LDAP (超详细题解)

    题目传送门 最后要求输出符合条件的用户 DN 的集合, ( 作为一名STL战士 ) ,可以考虑维护以属性名和属性值为索引, 对应值为符合条件的用户的set 的一个map 属性名 - 属性值 - {用户1,用户2…} 操作分为原子操作和逻辑操作, 只需要判断字符串的首字符即可区分两种操作 原子操作

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

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

    2024年02月01日
    浏览(84)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包