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