传送门:http://codeforces.com/contest/939/problem/D

本题是一个数据结构问题——并查集(Disjoint Set)。

给出两个长度相同,且仅由小写字母组成的字符串S=s[1..n]、T=t[1..n]。已知一个无序对(u,v)可以完成任意次的以下转换操作:u→vv→u。求将字符串S转换为T所需要的最少的无序对的数目,并打印出相应可行的方案下的所有无序对。

首先构造一张无向图G=<V,E>,表示S→T的状态转换图:结点集V={‘a’,’b’,’c’,...,’z’};边集E={(si,ti)|si≠ti,i=1,2,...,n}。对于这张图的连通分量,构造一个边集最小的连通图——即无向图的生成树。可以采用简化的Kruskal算法求这棵生成树。

实际上,这是一个并查集的问题。通过并查集,对于每一个i,判断siti是否在同一个集合中:若二者不在同一个集合中,则合并二者所在的集合。参考程序如下:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define MAX_V 26
#define MAX_N 100005 char s[MAX_N], t[MAX_N];
char uset[MAX_V], vset[MAX_V]; //Disjoint Set
int pa[MAX_V];
int rank[MAX_V]; void init(int n)
{
memset(pa, , sizeof(pa));
memset(rank, , sizeof(rank));
for (int i = ; i < n; i++) {
pa[i] = i;
rank[i] = ;
}
} int find(int x)
{
if (pa[x] == x) return x;
else return pa[x] = find(pa[x]);
} void unite(int x, int y)
{
x = find(x);
y = find(y);
if (x == y) return;
if (rank[x] < rank[y]) pa[x] = y;
else {
pa[y] = x;
if (rank[x] == rank[y]) rank[x]++;
}
} bool same(int x, int y)
{
return find(x) == find(y);
} int main(void)
{
int n;
scanf("%d", &n);
scanf("%s", s);
scanf("%s", t);
int cnt = ;
init(MAX_V);
for (int i = ; i < n; i++) {
if (s[i] != t[i]) {
int u = s[i] - 'a';
int v = t[i] - 'a';
if (!same(u, v)) {
unite(u, v);
uset[cnt] = u + 'a';
vset[cnt] = v + 'a';
cnt++;
}
}
}
printf("%d\n", cnt);
for (int i = ; i < cnt; i++)
printf("%c %c\n", uset[i], vset[i]);
return ;
}

最新文章

  1. sh 自动化安装配置FTP服务器
  2. ICSharpCode.SharpZipLib.dll 移植WP
  3. 从tomcat启动到springIoC容器初始化(编辑中)
  4. QT 记事本小程序
  5. 【php】mysql全局ID生成方案
  6. IOS NSDate NSDateFormatter 导致相差8小时
  7. C++学习笔记-1-自增和自减运算符
  8. iOS设备的重力感应
  9. mvc actionresult 判断是否回发?
  10. 无插件,直接加参数,chrome它可以模拟手机浏览器
  11. Windows安装Mysql5.7.10绿色版
  12. chromium源码阅读--进程间通信(IPC)
  13. XML记一次带命名空间的xml读取
  14. 微信小程序--修改data数组或对象里面的值
  15. Day2-异步IO+Scrapy爬虫
  16. SQL-34 对于表actor批量插入如下数据
  17. 协程之gevent
  18. unittest框架,调用函数类 和 调用函数外的 方法
  19. 重新部署mysql遇到的问题
  20. 推荐系统(1)--splitting approaches for context-aware recommendation

热门文章

  1. python 执行shell
  2. ios13--购物车优化
  3. oc81--copy内存管理
  4. [BZOJ 1660] Bad Hair Day
  5. QT Creater环境搭建
  6. IDEA Spark Streaming 操作(套接字流)-----make socket数据源
  7. MySQL 1366错误解决办法
  8. PCB genesis SET取中心点--算法实现
  9. [Swift通天遁地]八、媒体与动画-(3)实现视频播放的水印、Overlay、暂停时插入广告等效果
  10. $tsinsenA1067$