LEXICOGRAPHICALLY MINIMAL STRING HACKEREARTH
#include<bits/stdc++.h>
using namespace std;
int const N=28;
int arr[N]={0}, mn[N]={0};
void initialise(){
for(int i=0;i<=26;i++){
arr[i]=i;
mn[i]=i;
}
return;
}
int root(int i){
while(i!=arr[i]){
i=arr[i];
}
return i;
}
void wunion(int a, int b){
int root_a=root(a);
int root_b=root(b);
if(root_a==root_b) return;
arr[root_b]=root_a;
mn[root_a]=min(mn[root_b],mn[root_a]);
return;
}
vector<char> Solution (string A, string C, string B) {
initialise();
for(int i=0;i<A.length();i++){
int temp1=int(A[i])-97;
int temp2=int(B[i])-97;
wunion(temp1,temp2);
}
vector<char> ans;
for(int i=0;i<C.length();i++){
ans.push_back(char(mn[root(int(C[i])-97)]+97));
}
return ans;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
string A;
getline(cin, A);
string B;
getline(cin, B);
string C;
getline(cin, C);
vector<char> out_;
out_ = Solution(A, C, B);
for(auto x:out_) cout<<x;
cout<<endl;
}
Comments
Post a Comment