前置: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 << ' ';
}