记录
#include <bits/stdc++.h>
using namespace std;
#define hh printf("\n")
#define kg printf(" ")
#define ls p*2
#define rs p*2+1
namespace quickread{
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline char readchar(){
char ch=getchar();
while(!(ch>='a'&&ch<='z')) ch=getchar();
return ch;
}
}
using namespace quickread;
const int N=2e5+10;
int n,a[N],segment_tree[N*5],lazy[N*5];
void push_up(int p){
if(segment_tree[ls]==segment_tree[rs]) segment_tree[p]=segment_tree[ls];
else segment_tree[p]=-1;
}
void push_down(int p){
if(lazy[p]==-1) return;
segment_tree[ls]=segment_tree[rs]=lazy[p];
lazy[ls]=lazy[rs]=lazy[p];
lazy[p]=-1;
}
void build(int l,int r,int p){
segment_tree[p]=lazy[p]=-1;
if(l==r){
segment_tree[p]=a[l];
return;
}
int m=l+r>>1;
build(l,m,ls),build(m+1,r,rs);
push_up(p);
}
void update(int l,int r,int p,int u,int v){
if(segment_tree[p]==u){
segment_tree[p]=lazy[p]=v;
return;
}
if(l==r) return;
if(segment_tree[p]!=-1) return;
push_down(p);
int m=l+r>>1;
update(l,m,ls,u,v),update(m+1,r,rs,u,v);
push_up(p);
}
void query(int l,int r,int p){
if(segment_tree[p]!=-1){
for(int i=l;i<=r;i++) a[i]=segment_tree[p];
return;
}
push_down(p);
int m=l+r>>1;
query(l,m,ls),query(m+1,r,rs);
}
signed main(){
n=read();
for(int i=1;i<=n;i++) a[i]=readchar()-'a';
build(1,n,1);
int m=read();
for(int i=1;i<=m;i++){
int x=readchar()-'a',y=readchar()-'a';
if(x==y) continue;
update(1,n,1,x,y);
}
query(1,n,1);
for(int i=1;i<=n;i++) putchar(a[i]+'a');
return 0;
}