1. 程式人生 > 實用技巧 >CF1383A String Transformation 1|並查集

CF1383A String Transformation 1|並查集

連結

題意:

有字串\(A\)\(B\),每次在\(A\)中選取一部分相同的字母,改成另一個比該字母的字母,問將A改成B的最少步驟

分析:

從樣例看

3
aab
bcc
(aab-bbb-bcc)

本例中,第2個‘a'先轉化成’b',再連同’b'轉化為‘c'。不難看出減少操作次數可以通過先轉化為一箇中間的字母,再統一轉化為另一字母實現。

抽象成圖的形式,即在已有'a->b''b->c'的情況下不加'a->c'邊。在這個情況下容易想到並查集維護。易得操作次數增加當且僅當合並兩個塊。

這樣寫將無法得出方案,但本題亦未要求,因此可以通過。

#include<bits/stdc++.h>
using namespace std;
int f[30],ans,t,n;string st1,st2;
int fafa(int x)
{
	if (f[x]==x) return x;
	return f[x]=fafa(f[x]);
}
void hebing(int x,int y)
{
	x=fafa(x);y=fafa(y);
	if (x!=y)
	{
		ans++;
		f[x]=y;
	}
}
int main()
{
	cin>>t;
	for (int tt=1;tt<=t;tt++)
	{
		cin>>n;
		for (int i=1;i<=26;i++) f[i]=i;
		cin>>st1;
		cin>>st2;
		bool sit=true;ans=0;
		for (int i=0;i<n;i++)
		{
			if (st1[i]>st2[i])
			{
				cout<<"-1\n";sit=false;
				break;
			}
			hebing(st1[i]-'a'+1,st2[i]-'a'+1);
		}
		if (sit) cout<<ans<<endl;
		ans=0;
	} 
	return 0;
}