虚拟数组 待定/。
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
int f[1000001],n,m;
int hash1[100001];
set<int> st;
void init()
{
for(int i=0;i<n;i++)
{
f[i]=i;
hash1[i]=i;
}
}
int find(int x)
{
if(x==f[x])
return f[x];
f[x]=find(f[x]);
return f[x];
}
void Union(int x,int y)
{
int a=find(x);
int b=find(y);
if(a==b) return ;
f[a]=b;
}
int main()
{
int cas=0,a,b;
char str[5];
while(scanf("%d %d",&n,&m)==2 &&(n||m))
{
init();
st.clear();
int num=n;
while(m--)
{
scanf("%s",str);
if(str[0]=='S')
{
scanf("%d",&a);
hash1[a]=num++;
f[hash1[a]]=hash1[a];
}
else {
scanf("%d %d",&a,&b);
Union(hash1[a],hash1[b]);
}
}
int ans=0;
for(int i=0;i<n;i++)
{
// printf("%d %d
",hash1[i],find(hash1[i]));
st.insert(find(hash1[i]));
}
printf("Case #%d: %d
",++cas,st.size());
}
return 0;
}