小 B 的魔法
小 B 表演魔法。
觀衆給他兩個 字符串 S,TS,T ,這兩個字符串中只包含 小寫 字母。
現在小 B 可以把兩個字符串中任意所有的字母 xx 替換成 yy( x,yx,y 代表任意字母),記爲一次魔法操作。
注:任意所有指的是任何一種字母,它在兩個串中的所有出現的位置都可以替換成同一種字母,當然也可以替換它們中的幾個。
觀衆想知道,將兩個字符串變爲全等的最少操作次數是多少?
小 B 只會變魔術,所以他想讓你求出這個次數。
注:全等指對於任意的 1\le i \le n1≤i≤n,都有 S[i]=T[i]S[i]=T[i]。 (字符串座標從 11 開始)
輸入格式
第一行一個整數 nn,表示字符串的長度。
接下來的兩行,每行一個長度爲 nn 的字符串,即 SS 和 TT。
輸出格式
一行一個整數,表示最少的操作次數。
數據範圍
對於 %30 的數據,1<=n<=10
對於 %70 的數據,1<=n<=10^3
對於 %100% 的數據,1<=n<=10^5
思路:此題的難點不在於代碼實現,而是在於爲什麼用並查集
代碼:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
typedef long long ll;
int pre[maxn];
int find(int x){
if(x==pre[x])return x;
else return pre[x]=find(pre[x]);
}
bool Merge(int x,int y){
int xx=find(x);
int yy=find(y);
if(xx!=yy){
pre[xx]=yy;
return true;
}
else{
return false;
}
}
char str1[maxn],str2[maxn];
int main(){
for(int i=0;i<26;i++){
pre[i]=i;
}
int n;
cin>>n;
scanf("%s",str1);
scanf("%s",str2);
int ans=0;
for(int i=0;i<n;i++){
if(Merge((int)str1[i]-'a',(int)str2[i]-'a')){
ans++;
}
}
cout<<ans<<endl;
return 0;
}