https://www.patest.cn/contests/gplt/L3-003
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=10005;
int n,k;
int fa[maxn];
int num[maxn];
int val[maxn];
int find(int x){
if (x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void unite(int x,int y){
x=find(x);
y=find(y);
if (x!=y){
fa[y]=x;
}
}
int main(){
cin >> n;
for (int i=1;i<=n;i++){
fa[i]=i;
}
for (int i=1;i<=n;i++){
scanf("%d:",&k);
for (int j=0;j<k;j++){
int x;
cin >> x;
if (!val[x]){ //兴趣x尚未有人喜欢
val[x]=i;
}
unite(find(val[x]),i); //通过相同兴趣,将人与人连接
}
}
for (int i=1;i<=n;i++){
num[find(i)]++;
}
int cnt=0;
int ans[maxn];
for (int i=1;i<=n;i++){
if (num[i]){
ans[cnt++]=num[i];
}
}
printf("%d\n",cnt);
sort(ans,ans+cnt);
for(int i=cnt-1;i>=0;i--){
if (i!=cnt-1) cout << " ";
cout << ans[i];
}
}