小B的魔法

小 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章