給兩個字串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...