​http://codeforces.com/contest/939/problem/D​

每次可以找一个字母对 (c1,c1) 以后这两个字符就可以随便相互转换 用最少的对数将两个字符串变得一样 且这些转换具有传递性

其实可以看做一个最小生成树 如果两字符串对应位置不相等 就当作在图上 有两个字符对应的点 两点之间有一条边 因为有传递性 所以我们要的就是用最小代价将图连通

#include <bits/stdc++.h>
using namespace std;

int f[50];
int n;
char ch1[100010],ch2[100010],u[50],v[50];

int getf(int p)
{
if(f[p]==p) return p;
else
{
f[p]=getf(f[p]);
return f[p];
}
}

bool unite(int u,int v)
{
int fu,fv;
fu=getf(u);
fv=getf(v);
if(fu!=fv)
{
f[fv]=fu;
return true;
}
else return false;
}

int main()
{
int i,ans;
scanf("%d%s%s",&n,ch1,ch2);
for(i=1;i<=26;i++) f[i]=i;
ans=0;
for(i=0;i<n;i++)
{
if(ch1[i]!=ch2[i])
{
if(unite(ch1[i]-'a'+1,ch2[i]-'a'+1))
{
ans++;
u[ans]=ch1[i],v[ans]=ch2[i];
}
}
}
printf("%d\n",ans);
for(i=1;i<=ans;i++) printf("%c %c\n",u[i],v[i]);
return 0;
}