L、智乃的数据库

按照题意进行模拟即可。

分组的话可以使用并查集或者hash,如果使用hash进行数组元素分组的话有个小技巧,就是利用sort将分组转化成数组切段,这样写起来就比较清爽了。

时间复杂度O(NMlogN)O(NMlogN)空间复杂度O(NM)O(NM)

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1005;
const int MAXS=100005;
const long long base=131;
const long long mod=1e9-7;
int n,m,k;
int dat[MAXN][MAXN];
int id[MAXN];
vector<int>group_id;
vector<int>ans;
long long hash_val[MAXN];
map<string,int>col_id;
char s[MAXS];
void hash_push(long long &hash,long long val)
{
	hash=(hash*base%mod+val)%mod;
}
void read_sql()
{
	scanf("%*s %*s %*s %*s %*s %*s %s",s);
	for(int l=0,r=0;s[l];l=r+2)
	{
		while(s[r+1]!=','&&s[r+1]!=';')++r;
		s[r+1]='\0';
		group_id.push_back(col_id[s+l]);
	}
	return;
}
int main()
{
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;++i)
	{
		id[i]=i;
	}
	for(int i=0;i<m;++i)
	{
		scanf("%s",s);
		col_id[s]=i;
	}
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<m;++j)
		{
			scanf("%d",&dat[i][j]);
		}
	}
	read_sql();
	for(int i=0;i<n;++i)
	{
		for(auto &j:group_id)
		{
			hash_push(hash_val[i],dat[i][j]);
		} 
	}
	sort(id,id+n,[](const int &A,const int &B){
		return hash_val[A]<hash_val[B];
	});
	for(int l=0,r=0;l<n;l=r+1)
	{
		while(r+1<n&&hash_val[id[r+1]]==hash_val[id[l]])++r;
		ans.push_back(r-l+1);
	}
	printf("%d\n",ans.size());
	for(auto &i:ans)printf("%d ",i);
	return 0;
}