0
点赞
收藏
分享

微信扫一扫

牛客寒假训练营 3 L(模拟,哈希)

_karen 2022-02-07 阅读 42

前置:vector之间可以比较,map可以存储vector和任意的数据结构

分析:只要把所选关键字相同的元素放在一起,就是一组

通过这样子,我们可以想到哈希表,哈希表的first存储关键字,second存储个数,如果需要组数的话,返回size就可以了

由于一组的分类是根据所选关键字是否相同来比较的,所以可以用vector来存储,通过vector之间的比较,我们就可以知道是否两个记录是否相同了

读入使用了*,加了*会被忽略

scanf("%*s %*s %*s %*s %*s %*s %s",sql+1);

采用数组分段+hash表的思想,分割出所有要查询的关键字以及他们的编号

for (int i = 1;i <= len;i++)
	{
		if (sql[i] == ';' || sql[i] == ',')
			q.push_back(s);
			s = "";
		else
			s += sql[i];
	}
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
const int N = 1005;
int n, m;
int Data[N][N];
string str[N];	//每个字段的名称
char sql[N*N];
map<string, int>  mp;
map<vector<int>, int>  ans;
//聚合所有相同的字段
vector<string> q;	//存储要查询的字段
void read_sql()
{
	scanf("%*s %*s %*s %*s %*s %*s %s", sql + 1);
	int len = strlen(sql + 1);
	string s;
	for (int i = 1;i <= len;i++)
	{
		if (sql[i] == ';' || sql[i] == ',')
		{
			q.push_back(s);
			s = "";
		}
		else
		{
			s += sql[i];
		}
	}
	return;
}
int main()
{
	cin >> n >> m;
	for (int i = 1;i <= m;i++)
		cin >> str[i], mp[str[i]] = i;
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= m;j++)
			cin >> Data[i][j];
	read_sql();
	int res = 0;
	
	for (int i = 1;i <= n;i++)
	{
		vector<int> v1;
		for (int j = 0;j < q.size();j++)
		{
			auto t = mp[q[j]];	//q[i]是第几个字段
			
			v1.push_back(Data[i][t]);
		}
		ans[v1]++;
		if (ans[v1] == 1) res++;
	}
	cout << res << '\n';
	for (auto t : ans)
		cout << t.second << ' ';
}
举报

相关推荐

0 条评论