Go: package main

import (
	"bufio"
	"os"
	"strings"
	"strconv"
	"fmt"
	)

var scanner = bufio.NewScanner(os.Stdin)
const INF = 0x7FFFFFFF

func main() {
	for scanner.Scan() {
		buf := strings.Split(scanner.Text(), " ")
		n, _ := strconv.Atoi(buf[0])
		m, _ := strconv.Atoi(buf[1])
		if n == 0 && m == 0 {
			break
		}
		chairs := make([]string, n)
		for i := range chairs {
			chairs[i] = "#"
		}
		sit := func(who string) {
			if who == "A" {
				chairs[getStringIndex(chairs, "#")] = "A" // A国の人は左から見て行って空いている席を見つけ次第座る
				// log.Println(chairs)
			} else if who == "B" {
				f := true
				for i := n-1; i > -1; i-- {
					// B国の人はA国人の隣以外で、右端から空いている椅子に座る
					if chairs[i] == "#" && (i == 0 || chairs[i-1] != "A") && (i == n-1 || chairs[i+1] != "A") {
								chairs[i] = "B"
								f = false
								break
					}
				}
				// A国人の隣しか空いていない場合、我慢して左端から空いている椅子に座る
				if f {
					chairs[getStringIndex(chairs, "#")] = "B"
				}
				// log.Println(chairs)
			} else if who == "C" { // C国人は人の隣に座りたい
				for i := 0; i < n; i++ {
					if chairs[i] != "#" {
						if i + 1 <= n-1 && chairs[i+1] == "#" {
							chairs[i+1] = "C"
							break
						} else if i - 1 >= 0 && chairs[i-1] == "#" {
							chairs[i-1] = "C"
							break
						}
					}
				}
				// log.Println(chairs)
			} else { // who == "D"
				// D国の人は人から離れて座りたい
				// どうしても誰かの隣に座らなければならない場合、その中で一番左側にある椅子に座る
				scores := make([]int, n)
				for i := range scores {
					scores[i] = INF
				}
				for i, v := range chairs {
					if v == "#" {
						scores[i]++
					}
				}
				for i := n-1; i > -1; i-- {
					tmp := 0
					if chairs[i] == "#" {
						tmp++
					} else {
						tmp = 0
					}
					scores[i] = min(scores[i], tmp)
				}
				chairs[getIntIndex(scores, getMax(scores))] = "D"
				// log.Println(chairs)
			}
		}
		scanner.Scan()
		if first := scanner.Text(); first == "A" || first == "D" {
			chairs[0] = first
		} else if first == "B" {
			chairs[len(chairs)-1] = "B"
		} else {
			chairs[n/2] = "C"
		}
		// log.Println(chairs)
		for i := 0; i < m-1; i++ {
			scanner.Scan()
			sit(scanner.Text())
		}
		fmt.Println(strings.Join(chairs, ""))
	}
}

func getStringIndex(chairs []string, who string) int {
	for i, v := range chairs {
		if v == who {
			return i
		}
	}
	return -1
}

func getIntIndex(scores []int, target int) int {
	for i, v := range scores {
		if v == target {
			return i
		}
	}
	return -1
}

func min(a, b int) int {
	if a > b {
		return b
	}
	return a
}

func getMax(scores []int) int {
	tmp := -1
	for _, v := range scores {
		if tmp < v {
			tmp = v
		}
	}
	return tmp
}

C++: #include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
#include<set>
#include<utility>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#include<sstream>
#define loop(i,a,b) for(int i=a;i<b;i++) 
#define rep(i,a) loop(i,0,a)
#define pb push_back
#define mp make_pair
#define all(in) in.begin(),in.end()
const double PI=acos(-1);
const double EPS=1e-10;
const int inf=1e8;
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int,int> pii;
int main(){
	int n,m;
	while(cin>>n>>m,n){
		vector<string>in(n,"");
//		rep(i,n)cin>>in[i];//
//		rep(i,n)if(in[i]=="0")in[i]="";
		rep(q,m){
			string s;cin>>s;
			if(s=="A"){
				rep(i,n)if(in[i]==""){
					in[i]="A";
					break;
				}
			}else if(s=="B"){
				vector<string>tmp=in;
				rep(i,n)if(in[i]=="A"){
					if(i)tmp[i-1]="!";
					if(i!=n-1)tmp[i+1]="!";
				}
				int I=inf;
				for(int i=n-1;i>=0;i--)if(tmp[i]==""){I=i;break;}
				if(I==inf){
					rep(i,n)if(in[i]==""){
						I=i;
						break;
					}
				}
				in[I]="B";
			}else if(s=="C"){
				if(!q){
					in[n/2]="C";
					continue;
				}
				rep(i,n)if(in[i]!=""){
					if(i!=n-1&&in[i+1]==""){
						in[i+1]="C";
						break;
					}else if(i&&in[i-1]==""){
						in[i-1]="C";
						break;
					}
				}
			}else{
				if(!q){
					in[0]="D";
					continue;
				}
				vi t;
				rep(i,n)if(in[i]!="")t.pb(i);
				int ma=t[0],mai=0;
				rep(i,t.size()-1){
					if(ma<(t[i+1]-t[i])/2){
						ma=(t[i+1]-t[i])/2;
						mai=t[i]+(t[i+1]-t[i])/2;
					}
				}
				if(ma<n-t[t.size()-1]-1){
					mai=n-1;
				}
				in[mai]="D";
			}
		}
		rep(i,n)cout<<(in[i]==""?"#":in[i]);
		cout<<endl;
	}
}

C++: #include<iostream>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)

int findlm(int n,char *in){
  rep(i,n)if(in[i] == 0)return i;
}

int findNotA(int n,char *in){
  for(int i=n-1;i>=0;i--){
    if (in[i] == 0 && (i==0||in[i-1]!= 'A') && (i == n-1 || in[i+1] != 'A'))return i;
  }
  return -1;
}

int nextP(int n,char *in){
  rep(i,n){
    if (in[i] != 0){
      if (i < n-1 && in[i+1] == 0)return i+1;
      if (i >0 && in[i-1] == 0)return i-1;
    }
  }
  return -1;
}

int notNextP(int n,char *in){
  int ret = -1,maxdist=0;
  rep(i,n){
    if( in[i] != 0)continue;
    int tmpdist = 100000;
    for(int j=i-1;j>=0;j--){
      if (in[j] != 0){tmpdist=i-j;break;}
    }
    for(int j=i+1;j<n;j++){
      if (in[j] != 0){tmpdist=min(tmpdist,j-i);break;}
    }
    if (tmpdist > maxdist)ret=i,maxdist = tmpdist;
  }
  return ret;
}

void put(int n,char *in,char inp){
  int index = -1;
  if (inp == 'A'){
    index = findlm(n,in);
  }else if (inp == 'B'){
    index = findNotA(n,in);
    if (index == -1)index = findlm(n,in);
  }else if (inp == 'C'){
    index = nextP(n,in);
    if (index == -1)index =n/2;
  }else if (inp == 'D'){
    index = notNextP(n,in);
    if (index == -1)index = 0;
  }
  in[index] = inp;
}


main(){
  char op[255];
  op['A']='A';  op['B']='B';  op['C']='C';  op['D']='D';
  op[0]='#';

  int n,m;
  char in[100];
  while(cin>>n>>m && n){
    rep(i,n)in[i] = 0;
    rep(i,m){
      char inp;
      cin>>inp;
      put(n,in,inp);
    }
    rep(i,n)cout << op[in[i]] ;
    cout << endl;
  }


}

C++: #include<stdio.h>
#include<algorithm>
using namespace std;
char str[101];
char c[2];
int p[100];
int ABS(int a){return a<0?-a:a;}
int main(){
	int a,b;
	while(scanf("%d%d",&a,&b),a+b){
		for(int i=0;i<a;i++)str[i]='#';
		str[a]=0;
		bool ok;
		for(int i=0;i<b;i++){
			scanf("%s",c);
			switch(c[0]){
				case 'A':
					for(int j=0;j<a;j++)
						if(str[j]=='#'){
							str[j]='A';
							break;
						}
					break;
				case 'B':
					ok=false;
					for(int j=a-1;j>=0;j--){
						if(str[j]=='#'&&(j==0||str[j-1]!='A')&&str[j+1]!='A'){
							ok=true;
							str[j]='B';
							break;
						}
					}
					if(!ok){
						for(int j=0;j<a;j++)
							if(str[j]=='#'){
								str[j]='B';
								break;
							}
					}
					break;
				case 'C':
					if(i==0){
						str[a/2]='C';
					}else{
						for(int j=0;j<a;j++){
							if(str[j]!='#'){
								if(str[j+1]=='#'){
									str[j+1]='C';
									break;
								}else if(j&&str[j-1]=='#'){
									str[j-1]='C';
									break;
								}
							}
						}
					}
					break;
				case 'D':
					for(int j=0;j<a;j++)p[j]=9999;
					for(int j=0;j<a;j++){
						if(str[j]!='#'){
							for(int k=0;k<a;k++)p[k]=min(p[k],ABS(j-k));
						}
					}
					int at=0;
					int cost=0;
					for(int j=0;j<a;j++){
						if(cost<p[j]){at=j;cost=p[j];}
					}
					str[at]='D';
					break;
			}
			//	printf("%s\n",str);
		}
		printf("%s\n",str);
	}
}