分析:并查集的使用。
#include <iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m,k;
int fa[100001];
int hob[100001];
int findFa(int x)
{
if(fa[x] == x) return x;
return findFa(fa[x]);
}
void uni(int a,int b)
{
int f1 = findFa(a);
int f2 = findFa(b);
if(f1 != f2)
fa[f1] = f2;
}
int ans[10001];
int cmp(int a,int b){return a>b;}
int main()
{
cin>>n;
for(int i = 1;i <= n ;i++)
fa[i] = i;
for(int i = 1; i <= n ;i++)
{
int num;
scanf("%d:",&num);
for(int j = 0 ; j< num ;j++)
{
int x;cin>>x;
if(hob[x] == 0)
hob[x] = i;
else
uni(hob[x], i);
}
}
int cnt = 0;
for(int i = 1; i <= n ;i++)
{
if(fa[i] == i) cnt++;
ans[findFa(i)] ++;
}
sort(ans,ans + 10001,cmp);
cout<<cnt<<endl;
for(int i = 0;i<cnt;i++)
{
if(i == 0)
cout<<ans[i];
else
cout<<" "<<ans[i];
}
return 0;
}