#include<stdio.h> #include<string.h> int fnum[200001];//父节点里面存放本集合内的元素个数 int bing[200001];//并查集使用 int tri[10000][53];//字典树 int tnum=0; int find(int k) { if(bing[k]!=k) bing[k]=find(bing[k]); return bing[k]; } void cinn(char temp[21]) { char c; scanf("%c",&c); int i=0; while(c!=' '&&c!='/n') { temp[i]=c; i++; scanf("%c",&c); } temp[i]='/0'; } void ttri(char temp[21],int &k) { char c;int kk; int i; int next; c=temp[0]; if(c>96)kk=c-96; else kk=c-38; if(tri[0][kk]==0) { tnum++; tri[0][kk]=tnum; } next=tri[0][kk]; for(i=1;temp[i]!='/0';i++) { c=temp[i]; if(c>96)kk=c-96; else kk=c-38; if(tri[next][kk]==0) { tnum++; tri[next][kk]=tnum; } next=tri[next][kk]; } k=next; } int main() { int k; scanf("%d",&k); while(k--) { tnum=0; int n;int num=0; scanf("%d",&n); char cc; scanf("%c",&cc); int i; for(i=0;i<=2*n+1;i++) bing[i]=i; memset(tri,0,100000*27); while(n--) { int tri1,tri2; char temp[21]; cinn(temp); ttri(temp,tri1); cinn(temp); ttri(temp,tri2); if(tri[tri1][0]==0&&tri[tri2][0]==0&&tri1!=tri2) { num++; tri[tri1][0]=num; fnum[num]=2; num++; tri[tri2][0]=num; bing[num]=num-1; } else if(tri[tri1][0]==0&&tri[tri2][0]==0&&tri1==tri2) { num++; tri[tri1][0]=num; fnum[num]=1; } else if(tri[tri1][0]!=0&&tri[tri2][0]==0) { num++; tri[tri2][0]=num; bing[num]=tri[tri1][0]; fnum[find(num)]++; } else if(tri[tri1][0]==0&&tri[tri2][0]!=0) { num++; tri[tri1][0]=num; bing[num]=tri[tri2][0]; fnum[find(num)]++; } else { if(find(tri[tri1][0])!=find(tri[tri2][0])) { fnum[find(tri[tri1][0])]+=fnum[find(tri[tri2][0])]; bing[find(tri[tri2][0])]=find(tri[tri1][0]); } } printf("%d/n",fnum[find(tri[tri1][0])]); } } return 0; }