字元的最少變換次數,並查集

2021-10-12 10:16:46 字數 1122 閱讀 4307

給兩個字串a, b。a合和b中的字元都是前20個字母(a~t),a需要進行一些變換,使得a等於b。

對於每一次變換:選取a中相同的字元,然後把它們用同乙個字元替換,並且替換的字元必須比原來的字元大。

問最少需要多少次操作,才能使得a等於b?如果不能相等,輸出-1.

題目鏈結

很容易想到,a中只要有乙個對應的字元比b大,那麼就直接輸出-1。

這個題應該用並查集做,或者是貪心。

反正只要20個字母,都是從一種字母變換到另一種字母。那麼就把字母連線起來, 讓它們的父節點相同,表示已經進行過這種操作,不需要再做一次了。

或者是它們本來就是一樣的字母, 父節點相同。

比如aab 變換到bcc。a和b不同,把a變換為b,a和c不同,把a變換為c。但是b不需要變換為c了。

因為a ->b, a->c, 兩次變換,b和c的父節點已經相同了。

#pragma warning(disable:4996)

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 100005;

char a[maxn], b[maxn];

int len;

int fa[maxn];

//fa:祖先節點

int find(int x)

void uni(int x, int y)

//查詢合併:並查集的基本操作

int main()

/*cout << find(a[i] - 'a') << " " << find(b[i] - 'a') << endl;*/

if (find(a[i] - 'a') == find(b[i] - 'a'))//如果它們的父節點已經相等了,就跳過

continue;

res++;

uni(a[i] - 'a', b[i] - 'a');

} if (flag)printf("-1\n");

else printf("%d\n", res);

} return 0;

}

分類並查集 並查集的複習

動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y是同類。第二種說法是 2 ...

並查集 並查集的刪除操作

描述 一天小 w 給學弟們上課,小 w 說 注意了,並查集只適合於加的操作,不太方便處理減的操作喲。j 老師聽了後,呵呵了一下。她課後找到小 w 說,其實並查集也可以做減的操作的。只看你如何靈活運用了。比如這個題 給你 n 個元素,最開始時分屬於 n 個集合,有如下三種操作 小 w 陷入了無盡的思考...

並查集 並查集的基本操作總結

並查集的定義 並 union 合併 查 find 查詢 集 set 查詢 並查集的實現 int father n 使用乙個陣列記錄 father 1 1 1的父節點是本身 father 2 1 2的父節點是1 並查集的初始化 for int i 1 i n i 並查集的查詢 int findfath...