并查集 模板题 水过
编一下号就ok
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define M 100100
#define INF 100000000
using namespace std;
int n;
char s1[M][21];
char s2[M][21];
char name[M*2][21];
char na[M*2][21];
int cnt;
int q[M*2];
int num[M*2];
int cmp_str(const void *a,const void *b)
{
return strcmp((char *)a,(char *)b);
}
int Bsearch(char *str)
{
int x ,y,mid;
x = 0; y = cnt;
while(x < y){
mid = x + (y-x)/2;
if(strcmp(str,na[mid]) == 0)
return mid;
else if(strcmp(str,na[mid]) > 0)
x = mid + 1;
else y = mid;
}
}
void deal_name()
{
cnt = 0;
strcpy(na[cnt++],name[0]);
for(int i = 1;i < 2*n;i++)
if(strcmp(name[i],name[i-1]) != 0)
strcpy(na[cnt++],name[i]);
}
int find(int x){ return q[x] == x ? x : q[x] = find(q[x]); }
void UFS()
{
for(int i = 0;i <= cnt;i++){
q[i] = i;
num[i] = 1;
}
for(int i = 0;i < n;i++){
int a = Bsearch(s1[i]);
int b = Bsearch(s2[i]);
int x = find(a);
int y = find(b);
if(x != y){
q[x] = y;
num[y] += num[x];
}
cout<<num[y]<<endl;
}
}
int main()
{
//freopen("in.in","r",stdin);
int cas;
cin>>cas;
while(cas--)
{
cin>>n;
for(int i = 0;i < n;i++){
cin>>s1[i]>>s2[i];
strcpy(name[i*2],s1[i]);
strcpy(name[i*2+1],s2[i]);
}
qsort(name,n*2,sizeof(name[0]),cmp_str);
deal_name();
UFS();
}
return 0;
}