L、智乃的数据库
按照题意进行模拟即可。
分组的话可以使用并查集或者hash,如果使用hash进行数组元素分组的话有个小技巧,就是利用sort将分组转化成数组切段,这样写起来就比较清爽了。
时间复杂度空间复杂度。
#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;
}