#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
struct unionFind{
int * d;
int N;
int M;
inline void malloc ( const int n) {
d = ( int * ) std:: malloc ( n* sizeof ( int ) ) ;
M = n;
}
inline void free ( void ) {
std:: free ( d) ;
}
inline void walloc( const int n, void ** mem= & wmem) {
walloc1d( & d, n, mem) ;
M = n;
}
inline void init( const int n) {
int i;
N = n;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
d[ i] = - 1 ;
}
}
inline void init( void ) {
init( M) ;
}
inline int get( int a) {
int t = a;
int k;
while ( d[ t] >= 0 ) {
t= d[ t] ;
}
while ( d[ a] >= 0 ) {
k= d[ a] ;
d[ a] = t;
a= k;
}
return a;
}
inline int connect( int a, int b) {
if ( d[ a] >= 0 ) {
a= get( a) ;
}
if ( d[ b] >= 0 ) {
b= get( b) ;
}
if ( a== b) {
return 0 ;
}
if ( d[ a] < d[ b] ) {
d[ a] + = d[ b] ;
d[ b] = a;
}
else {
d[ b] + = d[ a] ;
d[ a] = b;
}
return 1 ;
}
inline int operator( ) ( int a) {
return get( a) ;
}
inline int operator( ) ( int a, int b) {
return connect( a,b) ;
}
inline int & operator[ ] ( const int a) {
return d[ a] ;
}
inline int size( int a) {
a = get( a) ;
return - d[ a] ;
}
inline int sizeList( int res[ ] ) {
int i;
int sz= 0 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( d[ i] < 0 ) {
res[ sz++ ] = - d[ i] ;
}
}
return sz;
}
}
;
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
unionFind uf;
int vis[ 100000 ] ;
string str[ 100000 ] ;
class Solution{
public :
string smallestStringWithSwaps( string s, vector< vector< int >> & pairs) {
dummy_main( ) ;
int i;
int j;
int N = s.size ( ) ;
unionFind uf;
uf.walloc ( N) ;
uf.init ( N) ;
for ( i= ( 0 ) ; i< ( pairs.size ( ) ) ; i++ ) {
uf( pairs[ i] [ 0 ] , pairs[ i] [ 1 ] ) ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
vis[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
str[ i] = "" ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
str[ uf( i) ] + = s[ i] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( str[ i] .size ( ) ) {
sort( str[ i] .begin ( ) , str[ i] .end ( ) ) ;
}
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
j = uf( i) ;
s[ i] = str[ j] [ vis[ j] ++ ] ;
}
return s;
}
}
;
// cLay varsion 20190921-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// unionFind uf;
//
// int vis[100000];
// string str[100000];
//
// class Solution {
// public:
// string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
// dummy_main();
//
// int i, j, N = s.size();
// unionFind uf;
//
// uf.walloc(N);
// uf.init(N);
// rep(i,pairs.size()) uf(pairs[i][0], pairs[i][1]);
//
// rep(i,N) vis[i] = 0;
// rep(i,N) str[i] = "";
//
// rep(i,N) str[uf(i)] += s[i];
// rep(i,N) if(str[i].size()) sort(str[i].begin(), str[i].end());
//
// rep(i,N){
// j = uf(i);
// s[i] = str[j][vis[j]++];
// }
//
// return s;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQgKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQpzdHJ1Y3QgdW5pb25GaW5kewogIGludCAqZDsKICBpbnQgTjsKICBpbnQgTTsKICBpbmxpbmUgdm9pZCBtYWxsb2MoY29uc3QgaW50IG4pewogICAgZCA9IChpbnQqKXN0ZDo6bWFsbG9jKG4qc2l6ZW9mKGludCkpOwogICAgTSA9IG47CiAgfQogIGlubGluZSB2b2lkIGZyZWUodm9pZCl7CiAgICBzdGQ6OmZyZWUoZCk7CiAgfQogIGlubGluZSB2b2lkIHdhbGxvYyhjb25zdCBpbnQgbiwgdm9pZCAqKm1lbT0md21lbSl7CiAgICB3YWxsb2MxZCgmZCwgbiwgbWVtKTsKICAgIE0gPSBuOwogIH0KICBpbmxpbmUgdm9pZCBpbml0KGNvbnN0IGludCBuKXsKICAgIGludCBpOwogICAgTiA9IG47CiAgICBmb3IoaT0oMCk7aTwobik7aSsrKXsKICAgICAgZFtpXSA9IC0xOwogICAgfQogIH0KICBpbmxpbmUgdm9pZCBpbml0KHZvaWQpewogICAgaW5pdChNKTsKICB9CiAgaW5saW5lIGludCBnZXQoaW50IGEpewogICAgaW50IHQgPSBhOwogICAgaW50IGs7CiAgICB3aGlsZShkW3RdPj0wKXsKICAgICAgdD1kW3RdOwogICAgfQogICAgd2hpbGUoZFthXT49MCl7CiAgICAgIGs9ZFthXTsKICAgICAgZFthXT10OwogICAgICBhPWs7CiAgICB9CiAgICByZXR1cm4gYTsKICB9CiAgaW5saW5lIGludCBjb25uZWN0KGludCBhLCBpbnQgYil7CiAgICBpZihkW2FdPj0wKXsKICAgICAgYT1nZXQoYSk7CiAgICB9CiAgICBpZihkW2JdPj0wKXsKICAgICAgYj1nZXQoYik7CiAgICB9CiAgICBpZihhPT1iKXsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZihkW2FdIDwgZFtiXSl7CiAgICAgIGRbYV0gKz0gZFtiXTsKICAgICAgZFtiXSA9IGE7CiAgICB9CiAgICBlbHNlewogICAgICBkW2JdICs9IGRbYV07CiAgICAgIGRbYV0gPSBiOwogICAgfQogICAgcmV0dXJuIDE7CiAgfQogIGlubGluZSBpbnQgb3BlcmF0b3IoKShpbnQgYSl7CiAgICByZXR1cm4gZ2V0KGEpOwogIH0KICBpbmxpbmUgaW50IG9wZXJhdG9yKCkoaW50IGEsIGludCBiKXsKICAgIHJldHVybiBjb25uZWN0KGEsYik7CiAgfQogIGlubGluZSBpbnQmIG9wZXJhdG9yW10oY29uc3QgaW50IGEpewogICAgcmV0dXJuIGRbYV07CiAgfQogIGlubGluZSBpbnQgc2l6ZShpbnQgYSl7CiAgICBhID0gZ2V0KGEpOwogICAgcmV0dXJuIC1kW2FdOwogIH0KICBpbmxpbmUgaW50IHNpemVMaXN0KGludCByZXNbXSl7CiAgICBpbnQgaTsKICAgIGludCBzej0wOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGlmKGRbaV08MCl7CiAgICAgICAgcmVzW3N6KytdID0gLWRbaV07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzejsKICB9Cn0KOwojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHdtZW0gPSBtZW1hcnI7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KdW5pb25GaW5kIHVmOwppbnQgdmlzWzEwMDAwMF07CnN0cmluZyBzdHJbMTAwMDAwXTsKY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIHN0cmluZyBzbWFsbGVzdFN0cmluZ1dpdGhTd2FwcyhzdHJpbmcgcywgdmVjdG9yPHZlY3RvcjxpbnQ+PiYgcGFpcnMpewogICAgZHVtbXlfbWFpbigpOwogICAgaW50IGk7CiAgICBpbnQgajsKICAgIGludCBOID0gcy5zaXplKCk7CiAgICB1bmlvbkZpbmQgdWY7CiAgICB1Zi53YWxsb2MoTik7CiAgICB1Zi5pbml0KE4pOwogICAgZm9yKGk9KDApO2k8KHBhaXJzLnNpemUoKSk7aSsrKXsKICAgICAgdWYocGFpcnNbaV1bMF0sIHBhaXJzW2ldWzFdKTsKICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICB2aXNbaV0gPSAwOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIHN0cltpXSA9ICIiOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIHN0clt1ZihpKV0gKz0gc1tpXTsKICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBpZihzdHJbaV0uc2l6ZSgpKXsKICAgICAgICBzb3J0KHN0cltpXS5iZWdpbigpLCBzdHJbaV0uZW5kKCkpOwogICAgICB9CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgaiA9IHVmKGkpOwogICAgICBzW2ldID0gc3RyW2pdW3Zpc1tqXSsrXTsKICAgIH0KICAgIHJldHVybiBzOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDE5MDkyMS0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIHVuaW9uRmluZCB1ZjsKLy8gCi8vIGludCB2aXNbMTAwMDAwXTsKLy8gc3RyaW5nIHN0clsxMDAwMDBdOwovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgc3RyaW5nIHNtYWxsZXN0U3RyaW5nV2l0aFN3YXBzKHN0cmluZyBzLCB2ZWN0b3I8dmVjdG9yPGludD4+JiBwYWlycykgewovLyAgICAgZHVtbXlfbWFpbigpOwovLyAgICAgCi8vICAgICBpbnQgaSwgaiwgTiA9IHMuc2l6ZSgpOwovLyAgICAgdW5pb25GaW5kIHVmOwovLyAKLy8gICAgIHVmLndhbGxvYyhOKTsKLy8gICAgIHVmLmluaXQoTik7Ci8vICAgICByZXAoaSxwYWlycy5zaXplKCkpIHVmKHBhaXJzW2ldWzBdLCBwYWlyc1tpXVsxXSk7Ci8vIAovLyAgICAgcmVwKGksTikgdmlzW2ldID0gMDsKLy8gICAgIHJlcChpLE4pIHN0cltpXSA9ICIiOwovLyAKLy8gICAgIHJlcChpLE4pIHN0clt1ZihpKV0gKz0gc1tpXTsKLy8gICAgIHJlcChpLE4pIGlmKHN0cltpXS5zaXplKCkpIHNvcnQoc3RyW2ldLmJlZ2luKCksIHN0cltpXS5lbmQoKSk7Ci8vIAovLyAgICAgcmVwKGksTil7Ci8vICAgICAgIGogPSB1ZihpKTsKLy8gICAgICAgc1tpXSA9IHN0cltqXVt2aXNbal0rK107Ci8vICAgICB9Ci8vIAovLyAgICAgcmV0dXJuIHM7Ci8vICAgfQovLyB9Owo=