CF1383A String Transformation 1|並查集
阿新 • • 發佈:2020-07-25
題意:
有字串\(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; }