Problem:
難儀な人たちが座る椅子
4つの国の中心にある中立都市アイズシティには、大陸横断列車バンダイ号のホームがあります。 ホームには、バンダイ号を待つ乗客用の椅子が一列に用意されており、ホームに入ってきた人は自由に椅子を利用することができます。
このバンダイ号、安いし早いし快適ということで、周囲の4つの国からの利用者が絶えません。今日は開通記念日ということで、ホームに座っている人たちに特別なことをしてあげようと思っています。そのためには、改札を通った人たちがどこに座っているか把握しなければなりません。4つの国の人たちの難儀な性格を考慮して、椅子がどのように埋まっているかをシミュレートするプログラムを作成してください。改札を通った人たちは、次々に一列に並んだ椅子に座っていきます。4つの国の人たちは、国ごとに決まった性格と座り方があります。それぞれの座り方は以下の通りです。
A国人の性格
A 国人は座れればいい。左端から見ていき空いている椅子に座る。
B国人の性格
B 国人は A 国人が苦手。 A 国人の隣以外で、右端から空いている椅子に座る。ただし、 A国人の隣しか空いていない場合、我慢して左端から空いている椅子に座る。
C国人の性格
C 国人は人の隣に座りたい。左側から順に座っている人を見ていき、一番左側に座っている人  の右隣に座ろうとするが、そこが埋まっているならその人の左隣に座ろうとする。そこも埋まっ  ているなら次の人の隣に同条件で座ろうとする。どの椅子にも人が座っていなければ真ん中(椅子の数
n
が奇数の場合 (
n
+1)/2 、偶数の場合
n
/2+1 )の椅子に座る。
D国人の性格
D 国人は人の隣に座りたくない。一番近い人との距離が、一番大きくなる椅子に座ろうとする。同条件の椅子が複数ある場合や、どうしても誰かの隣に座らなければならない場合、その中で一番左側にある椅子に座る。誰も座っていない場合は左端の椅子に座る。
バンダイ号に乗ろうとしている乗客の情報を入力とし、 椅子にどのように座っているかを出力するプログラムを作成してください。左から順番に座っている人の国籍を出力します。ただし、空席の場合は # (半角シャープ)を出力してください。
Input
複数のデータセットの並びが入力として与えられます。        入力の終わりはゼロふたつの行で示されます。
各データセットは以下の形式で与えられます。
n
m
a
1
a
2
:
a
m
1 行目に椅子の数
n
(1 ≤
n
≤ 100) と乗客の数
m
(
m
≤
n
) が与えられます。続く
m
行に
i
人目の情報
a
i
が与えられます。
a
i
は１つの文字で、'A' ならば A 国人、'B' ならば B 国人、'C' ならば C 国人、'D' ならば D 国人を表します。
データセットの数は 100 を超えません。
Output
データセットごとに、最終的な椅子の状態を１行に出力します。
Sample Input
5 4
A
B
C
D
5 4
D
C
B
A
0 0
Output for the Sample Input
ACD#B
DCA#B

Submitted solutions:

code_snippet: #include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    while(1){
        int n,m;
        cin >> n >> m;
        if(n == 0) break;

        string a(n, '#');
        for(int i=0; i<m; i++){
            char c;
            cin >> c;
            if(c == 'A'){
                for(int j=0; j<n; j++){
                    if(a[j] == '#'){
                        a[j] = 'A';
                        break;
                    } 
                }
            }else if(c == 'B'){
                bool ok = false;
                for(int j=n-1; j>=0; j--){
                    if(a[j] != '#') continue;
                    if((j==0 or a[j-1]!='A') and (j==n-1 or a[j+1]!='A')){
                        a[j] = 'B';
                        ok = true;
                        break;
                    }
                }
                if(!ok){
                    for(int j=0; j<n; j++){
                        if(a[j] == '#'){
                            a[j] = 'B';
                            break;
                        } 
                    }
                }
            }else if(c == 'C'){
                if(i == 0){
                    a[n/2] = 'C';
                }else{
                    for(int j=0; j<n-1; j++){
                        if(a[j] == '#') continue;
                        if(a[j+1] == '#'){
                            a[j+1] = 'C';
                            break;
                        }else if(j!=0 and a[j-1]=='#'){
                            a[j-1] = 'C';
                            break;
                        }
                    }
                }
            }else{
                vector<int> b(n, 999);
                for(int j=0; j<n; j++){
                    if(a[j] != '#') b[j] = 0;
                }
                for(int j=0; j<n; j++){
                    for(int k=0; k<n; k++){
                        if(k!=0) b[k] = min(b[k], b[k-1]+1);
                        if(k!=n-1) b[k] = min(b[k], b[k+1]+1);
                    }
                }
                int me = *max_element(b.begin(), b.end());
                for(int j=0; j<n; j++){
                    if(b[j] == me){
                        a[j] = 'D';
                        break;
                    }
                }
            }
        }
        cout << a << endl;
    }
    return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 3008
final_rank: 9

code_snippet: #define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define ALL(a) (a).begin(), (a).end()

int get_d(vector<string> seat, int idx, int n)
// idxから最短にいる人の距離を返す
// seat:座席
// n : seat length
{
	int left_idx, right_idx;
	rep(i, n)
	{
		// 左右に1つずつ増やしていく
		left_idx = idx - i;
		right_idx = idx + i;
		if (left_idx >= 0 && seat[left_idx] != "#") // !("#") <=> 人がいる
		{
			return i;
		}

		if (right_idx < n && seat[right_idx] != "#")
		{
			return i;
		}
	}
	return 0; // warningがうざいのでつけています
}

int where(vector<string> seat, string person, int n)
// personが座る位置を返す
// seat: 座席の状態
// n: seat length
{
    if (person == "A")
    {
        rep(i, n)
        {
            if (seat[i] == "#"){  // 空席なら座る
                return i;
            }
        }
    }
    else if (person == "B")
    {
        // 右から見ていく
        for (int i = n - 1; i >= 0; i--)
        {   
            // out-of-boundsになるので場合わけ
            if (i == n - 1)
            {
                if (seat[i - 1] != "A" && seat[i] == "#"){   // 空席かつ左隣がA国人ではない
                    return i;
                }
            }
            else if (i == 0)
            {
                if (seat[i + 1] != "A" && seat[i] == "#"){   // 空席かつ右隣がA国人ではない
                    return i;
                }
            }
            else
            {
                if (seat[i - 1] != "A" && seat[i + 1] != "A" && seat[i] == "#"){  // 空席かつ左右がA国人ではない
                    return i;
                }
            }
        }
        rep(i, n)
        {
            // A国人の隣しか空いていないなら、左から見ていって空いている席に座る
            if (seat[i] == "#"){
                return i;
            }
        }
    }
    else if (person == "C")
    {
        vector<string> initial_seat(n, "#");
        // 誰も座っていない <=> 全部 "#" なら中央に座る
        if (initial_seat == seat)
        {
            return n / 2;
        }
        else
        {
            // 左から見ていく。
            for (int i = 0; i < n; i++)
            {
                if (seat[i] != "#") // 人が座っているなら
                {
                    if (i < n - 1 && seat[i + 1] == "#") // 右側に座ろうとする
                    {
                        return i + 1;
                    }
                    else if (i > 0 && seat[i - 1] == "#") // それがダメなら左側
                    {
                        return i - 1;
                    }
                }
            }
        }
    }
    else if (person == "D")
    {
        vector<string> initial_seat(n, "#");
        // 誰も座っていなければ左端に座る
        if (initial_seat == seat)
        {
            return 0;
        }
        else
        {
            // md: 最大の距離
            // max_idx: その時のidx
            int md = -1;
            int max_idx = -1;
            rep(i, n)
            {
                int d = get_d(seat, i, n);
                if (d > md)
                {
                    md = d;
                    max_idx = i;
                }
            }
            return max_idx;
        }
    }
    else
    {
        cout << "ignore" << endl;
        return 1000001;
    }
    return 0; // warningがうざいのでつけています
}

void output(vector<string> seat)
{
    for (string seet : seat)
    {
        cout << seet;
    }
    cout << endl;
}

int main()
{
    int n, m;
    string person;
    while (true)
    {
        cin >> n >> m;
        if (n == 0 && m == 0) {
            break;
        }
        vector<string> seat(n, "#");
        rep(i, m)
        {
            cin >> person;
            int idx = where(seat, person, n);
            //output(seat);
            seat[idx] = person;
        }
        output(seat);
    }
}
accuracy: 1
time_ms: 20
memory_kb: 3192
final_rank: 11

code_snippet: #define _GLIBCXX_DEBUG
#include "bits/stdc++.h"
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define ALL(a) (a).begin(), (a).end()

void output(vector<string> seat)
{
	for (string seet : seat)
	{
		cout << seet;
	}
	cout << endl;
}

int get_d(vector<string> seat, int idx, int n)
// idxから最短にいる人の距離を返す
// seat:座席
// n : seat length
{
	int left_idx, right_idx;
	rep(i, n)
	{
		// 左右に1つずつ増やしていく
		left_idx = idx - i;
		right_idx = idx + i;
		if (left_idx >= 0 && seat[left_idx] != "#") // !("#") <=> 人がいる
		{
			return i;
		}

		if (right_idx < n && seat[right_idx] != "#")
		{
			return i;
		}
	}
	return 0; // warningがうざいのでつけています
}

int where(vector<string> seat, string person, int n)
// personが座る位置を返す
// seat: 座席の状態
// n: seat length
{
	if (person == "A")
	{
		rep(i, n)
		{
			if (seat[i] == "#")  // 空席なら座る
				return i;
		}
	}
	else if (person == "B")
	{
		// 右から見ていく
		for (int i = n - 1; i >= 0; i--)
		{
			// out-of-boundsになるので場合わけ
			if (i == n - 1)
			{
				if (seat[i - 1] != "A" && seat[i] == "#")   // 空席かつ左隣がA国人ではない
					return i;
				continue;
			}
			else if (i == 0)
			{
				if (seat[i + 1] != "A" && seat[i] == "#")   // 空席かつ右隣がA国人ではない
					return i;
				continue;
			}
			else
			{
				if (seat[i - 1] != "A" && seat[i + 1] != "A" && seat[i] == "#")  // 空席かつ左右がA国人ではない
					return i;
			}
		}
		rep(i, n)
		{
			// A国人の隣しか空いていないなら、左から見ていって空いている席に座る
			if (seat[i] == "#")
				return i;
		}
	}
	else if (person == "C")
	{
		vector<string> initial_seat(n, "#");
		// 誰も座っていない <=> 全部 "#" なら中央に座る
		if (initial_seat == seat)
		{
			if (n % 2 == 0)
			{
				return (n / 2);
			}
			else
			{
				return n / 2;
			}
		}
		else
		{
			// 左から見ていく。
			for (int i = 0; i < n; i++)
			{
				if (seat[i] != "#") // 人が座っているなら
				{
					if (i < n - 1 && seat[i + 1] == "#") // 右側に座ろうとする
					{
						return i + 1;
					}
					else if (i > 0 && seat[i - 1] == "#") // それがダメなら左側
					{
						return i - 1;
					}
				}
			}
		}
	}
	else if (person == "D")
	{
		vector<string> initial_seat(n, "#");
		// 誰も座っていなければ左端に座る
		if (initial_seat == seat)
		{
			return 0;
		}
		else
		{
			// md: 最大の距離
			// max_idx: その時のidx
			int md = -1;
			int max_idx = -1;
			rep(i, n)
			{
				int d = get_d(seat, i, n);
				// cout<<d<<endl;
				if (d > md)
				{
					md = d;
					max_idx = i;
				}
			}
			return max_idx;
		}
	}
	else
	{
		cout << "ignore" << endl;
		return 1001;
	}
	return 0; // warningがうざいのでつけています
}

int main()
{
	int n, m;
	string person;
	while (true)
	{
		cin >> n >> m;
		if (n == 0 && m == 0)
			break;
		vector<string> seat(n, "#");
		rep(i, m)
		{
			cin >> person;
			// output(seat);
			int idx = where(seat, person, n);
			seat[idx] = person;
		}
		output(seat);
	}
}
accuracy: 1
time_ms: 20
memory_kb: 3116
final_rank: 10

code_snippet: #define _GLIBCXX_DEBUG
#include "bits/stdc++.h"
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define ALL(a) (a).begin(), (a).end()

void output(vector<string> seat)
{
	for (string seet : seat)
	{
		cout << seet;
	}
	cout << endl;
}

int get_d(vector<string> seat, int idx, int n)
// idxから最短にいる人の距離を返す
// seat:座席
// n : seat length
{
	int left_idx, right_idx;
	rep(i, n)
	{
		// 左右に1つずつ増やしていく
		left_idx = idx - i;
		right_idx = idx + i;
		if (left_idx >= 0 && seat[left_idx] != "#") // !("#") <=> 人がいる
		{
			return i;
		}

		if (right_idx < n && seat[right_idx] != "#")
		{
			return i;
		}
	}
	return 0; // warningがうざいのでつけています
}

int where(vector<string> seat, string person, int n)
// personが座る位置を返す
// seat: 座席の状態
// n: seat length
{
	if (person == "A")
	{
		rep(i, n)
		{
			if (seat[i] == "#")  // 空席なら座る
				return i;
		}
	}
	else if (person == "B")
	{
		// 右から見ていく
		for (int i = n - 1; i >= 0; i--)
		{
			// out-of-boundsになるので場合わけ
			if (i == n - 1)
			{
				if (seat[i - 1] != "A" && seat[i] == "#")   // 空席かつ左隣がA国人ではない
					return i;
				continue;
			}
			else if (i == 0)
			{
				if (seat[i + 1] != "A" && seat[i] == "#")   // 空席かつ右隣がA国人ではない
					return i;
				continue;
			}
			else
			{
				if (seat[i - 1] != "A" && seat[i + 1] != "A" && seat[i] == "#")  // 空席かつ左右がA国人ではない
					return i;
			}
		}
		rep(i, n)
		{
			// A国人の隣しか空いていないなら、左から見ていって空いている席に座る
			if (seat[i] == "#")
				return i;
		}
	}
	else if (person == "C")
	{
		vector<string> initial_seat(n, "#");
		// 誰も座っていない <=> 全部 "#" なら中央に座る
		if (initial_seat == seat)
		{
			if (n % 2 == 0)
			{
				return (n / 2);
			}
			else
			{
				return n / 2;
			}
		}
		else
		{
			// 左から見ていく。
			for (int i = 0; i < n; i++)
			{
				if (seat[i] != "#") // 人が座っているなら
				{
					if (i < n - 1 && seat[i + 1] == "#") // 右側に座ろうとする
					{
						return i + 1;
					}
					else if (i > 0 && seat[i - 1] == "#") // それがダメなら左側
					{
						return i - 1;
					}
				}
			}
		}
	}
	else if (person == "D")
	{
		vector<string> initial_seat(n, "#");
		// 誰も座っていなければ左端に座る
		if (initial_seat == seat)
		{
			return 0;
		}
		else
		{
			// md: 最大の距離
			// max_idx: その時のidx
			int md = -1;
			int max_idx = -1;
			rep(i, n)
			{
				int d = get_d(seat, i, n);
				// cout<<d<<endl;
				if (d > md)
				{
					md = d;
					max_idx = i;
				}
			}
			return max_idx;
		}
	}
	else
	{
		cout << "ignore" << endl;
		return 1001;
	}
	return 0; // warningがうざいのでつけています
}

int main()
{
	int n, m;
	string person;
	while (true)
	{
		cin >> n >> m;
		if (n == 0 && m == 0)
			break;
		vector<string> seat(n, "#");
		rep(i, m)
		{
			cin >> person;
			// output(seat);
			int idx = where(seat, person, n);
			seat[idx] = person;
		}
		output(seat);
	}
}
accuracy: 1
time_ms: 20
memory_kb: 3000
final_rank: 8

code_snippet: #include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
//#include <set>

int n, m; //テヲツ、ツ?・ツュツ? テ、ツコツコ

int main() {
    while(std::cin >> n >> m, n + m) {
        std::string str(n, '#');

        char q;
        for(int a = 0; a < m; ++a) {
            std::cin >> q;

            bool ok;
            switch(q) {
            case 'A':
                str[str.find("#")] = 'A';
                break;
            case 'B':
                ok = false;
                for(int i = n - 1; i >= 0; --i) {
                    if((i == 0 || str[i - 1] != 'A') && (i == n - 1 || str[i + 1] != 'A') && str[i] == '#') {
                        ok = true;
                        str[i] = 'B';
                        break;
                    }
                }
                if(!ok) {
                    str[str.find("#")] = 'B';
                }
                break;
            case 'C':
                ok = false;
                for(int i = 0; i < n; ++i) {
                    if(str[i] != '#') {
                        if(i != n - 1 && str[i + 1] == '#') {
                            str[i + 1] = 'C';
                            ok = true; break;
                        }
                        if(i != 0 && str[i - 1] == '#') {
                            str[i - 1] = 'C';
                            ok = true; break;
                        }
                    }
                }

                if(!ok) {
                    str[n / 2] = 'C';
                }
                break;
            case 'D':
                int dist[101];
                for(int i = 0; i < n; ++i) {
                    int d = 1e+9;
                    if(str[i] == '#') {
                        for(int j = 0; j < n; ++j) {
                            if(str[j] != '#') {
                                d = std::min(d, std::abs(i - j));
                            }
                        }
                    }else {
                        d = 0;
                    }
                    
                    dist[i] = d;
                }

                int maxIdx = 0;
                for(int i = 1; i < n; ++i) {
                    if(dist[i] > dist[maxIdx]) {
                        maxIdx = i;
                    }
                }

                str[maxIdx] = 'D';

                break;
            }
//            std::cout << str << std::endl;
        }

        std::cout << str << std::endl;
    }
}
accuracy: 1
time_ms: 10
memory_kb: 1204
final_rank: 5

code_snippet: #include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
//#include <set>

int n, m; //??????, ???

int main() {
    while(std::cin >> n >> m, n + m) {
        std::string str(n, '#');

        char q;
        for(int a = 0; a < m; ++a) {
            std::cin >> q;

            bool ok;
            switch(q) {
            case 'A':
                str[str.find("#")] = 'A';
                break;
            case 'B':
                ok = false;
                for(int i = n - 1; i >= 0; --i) {
                    if((i == 0 || str[i - 1] != 'A') && (i == n - 1 || str[i + 1] != 'A') && str[i] == '#') {
                        ok = true;
                        str[i] = 'B';
                        break;
                    }
                }
                if(!ok) {
                    str[str.find("#")] = 'B';
                }
                break;
            case 'C':
                ok = false;
                for(int i = 0; i < n; ++i) {
                    if(str[i] != '#') {
                        if(i != n - 1 && str[i + 1] == '#') {
                            str[i + 1] = 'C';
                            ok = true; break;
                        }
                        if(i != 0 && str[i - 1] == '#') {
                            str[i - 1] = 'C';
                            ok = true; break;
                        }
                    }
                }

                if(!ok) {
                    str[n / 2] = 'C';
                }
                break;
            case 'D':
                int dist[101];
                for(int i = 0; i < n; ++i) {
                    int d = 1e+9;
                    if(str[i] == '#') {
                        for(int j = 0; j < n; ++j) {
                            if(str[j] != '#') {
                                d = std::min(d, std::abs(i - j));
                            }
                        }
                    }else {
                        d = 0;
                    }
                    
                    dist[i] = d;
                }

                int maxIdx = 0;
                for(int i = 1; i < n; ++i) {
                    if(dist[i] > dist[maxIdx]) {
                        maxIdx = i;
                    }
                }

                str[maxIdx] = 'D';

                break;
            }
//            std::cout << str << std::endl;
        }

        std::cout << str << std::endl;
    }
}
accuracy: 1
time_ms: 10
memory_kb: 1204
final_rank: 5

code_snippet: /*
 * src.cpp
 *
 *  Created on: 2016/07/27
 *      Author: joi
 */

#include <bits/stdc++.h>

#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,a) FOR(i,0,a)

using namespace std;

const int MAX_N=1e2,INF=1e8;

int n,m;

char chairs[MAX_N+1];

int dist(int a){
	int res=INF;
	REP(i,n){
		if (chairs[i]!='#'){
			res=min(res,abs(i-a));
		}
	}
	return res;
}

int main(){
	do{
		cin>>n>>m;
		if (n || m){
			cin.ignore();
			REP(i,n){
				chairs[i]='#';
			}
			chairs[n]=0;
			REP(i,m){
				char c;
				cin>>c;
				switch (c){
				case 'A':{
					REP(i,n){
						if (chairs[i]=='#'){
							chairs[i]='A';
							break;
						}
					}
					break;
				}
				case 'B':{
					int v=-1;
					for (int i=n-1;i>=0;i--){
						if (chairs[i]=='#'){
							if (i!=0){
								if (chairs[i-1]=='A'){
									continue;
								}
							}
							if (i+1!=n){
								if (chairs[i+1]=='A'){
									continue;
								}
							}
							v=i;
							break;
						}
					}
					if (v!=-1){
						chairs[v]='B';
					}else{
						REP(i,n){
							if (chairs[i]=='#'){
								chairs[i]='B';
								break;
							}
						}
					}
					break;
				}
				case 'C':{
					if (i==0){
						if (n%2==1){
							chairs[(n+1)/2-1]='C';
						}else{
							chairs[n/2]='C';
						}
					}else{
						REP(i,n){
							if (chairs[i]!='#'){
								if (i+1!=n && chairs[i+1]=='#'){
									chairs[i+1]='C';
									break;
								}
								if (i!=0 && chairs[i-1]=='#'){
									chairs[i-1]='C';
									break;
								}
							}
						}
					}
					break;
				}
				case 'D':{
					int a=0,d=dist(0);
					FOR(i,1,n){
						if (dist(i)>d){
							a=i;
							d=dist(i);
						}
					}
					chairs[a]='D';
					break;
				}
				}
			}
			cout<<chairs<<endl;
		}
	}while(n || m);
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1156
final_rank: 2

code_snippet: #include <bits/stdc++.h>
using namespace std;
// 12:46

string chair;


int goA(char c){
	for(int i = 0 ; i < chair.size() ; i++)
		if( chair[i] == '#'){
			chair[i] = c;
			return 1;
		}
	return 0;
}
int goB(char c){
	for(int i = chair.size() -1  ; i >= 0 ; i--)
		if( chair[i] == '#' && (!i||chair[i-1]!='A') && (i+1==chair.size()||chair[i+1]!='A') ){
			chair[i] = c;
			return 1;
		}
	return goA(c);
}
int goC(char c){
	if( count(chair.begin(),chair.end(),'#') == chair.size() ){
		if( chair.size() % 2 ) chair[(1+chair.size())/2-1] = c;
		else chair[chair.size()/2] = c;
		return 1;
	}
	for(int i = 0 ; i < chair.size() ; i++)
		if( chair[i] != '#'){
			for(int j = 1 ; j >= -1 ; j--){
				if( i+j >= 0 && i+j < chair.size() && chair[i+j] == '#' ){
					chair[i+j] = c;
					return 1;
				}
			}
		}

	return 0;
}
int goD(char c){
	int pos;
	int dst = -2e9;
	for(int i = 0 ; i < chair.size() ; i++){
		if( chair[i] == '#' ){
			int dist = 1e9;
			for(int j = 0 ; j < chair.size() ; j++)
				if( chair[j] != '#') dist = min(dist,abs(i-j));

			if( dst < dist){
				dst = dist;
				pos = i;
			}
		}
	}
	chair[pos] = c;
	return 1;
}


int main(){
	int n,m;
	while( cin >> n >> m && n ){
		chair = string(n,'#');
		for(int i = 0 ; i < m ; i++){
			char c; cin >> c;
			if( c == 'A' ) goA(c);
			if( c == 'B' ) goB(c);
			if( c == 'C' ) goC(c);
			if( c == 'D' ) goD(c);
		}
		cout << chair << endl;
	}
}
accuracy: 1
time_ms: 10
memory_kb: 1208
final_rank: 7

code_snippet: #include<bits/stdc++.h>
using namespace std;
#define int long long
#define REP(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define rep(i,n) REP((i),0,(n))
#define RREP(i,a,b) for(int i=(int)(a);i>=(int)(b);i--)
#define rrep(i,n) RREP(i,n,0)
#define each(it,X) for(__typeof((X).begin())  it=(X).begin();it!=(X).end();it++)
#define all(v) ((v).begin(),(v).end())
#define fi first
#define se second
#define pb push_back
typedef pair<int,int>pr;
typedef vector<int>vi;
typedef vector<vi>vvi;
typedef set<int>si;
const int INF=1070000000ll;
const int mod=1000000007ll;

int n,m;
char seet[100];
void A(){
    rep(i,n)if(seet[i]=='#'){
        seet[i]='A';
        return;
    }
}
void B(){
    rrep(i,n-1)if(seet[i]=='#'){
        if((i!=0||seet[i-1]!='A')&&(i!=n-1||seet[i+1]!='A')){
            seet[i]='B';
            return;
        }
    }
    rep(i,n)if(seet[i]=='#'){
        seet[i]='B';
        return;
    }
}
void C(){
    rep(i,n)if(seet[i]!='#'){
        if(i!=n-1&&seet[i+1]=='#'){
            seet[i+1]='C';return;
        }
        if(i!=0&&seet[i-1]=='#'){
            seet[i-1]='C';return;
        }
    }
    seet[n/2]='C';
}
void D(){
    int ma=0,dist=0;
    rep(i,n)if(seet[i]=='#'){
        int v=1000;
        rep(j,n)if(seet[j]!='#'){
            v=min(abs(i-j),v);
        }
        if(dist<v){
            dist=v;
            ma=i;
        }
    }
    seet[ma]='D';
}
signed main(){
    cin.tie(0);ios_base::sync_with_stdio(0);

    while(cin>>n>>m,n||m){
        fill_n(seet,n,'#');
        rep(i,m){
            char c;cin>>c;
            switch(c){
                case 'A':A();break;
                case 'B':B();break;
                case 'C':C();break;
                case 'D':D();break;
            }
        }
        rep(i,n)cout<<seet[i];cout<<endl;
    }
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1200
final_rank: 4

code_snippet: #include <iostream>
#include <cstdlib>
#include <string>
using namespace std;

char chair[128];
int n, m;
const int M = 2;

void A() {
	for(int i = 0; i < n; i++) {
		if(chair[i+M] == 'N') {
			chair[i+M] = 'A';
			break;
		}
	}
}

void B() {
	for(int i = n-1; i >= 0; i--) {
		if(chair[i+M] == 'N' && chair[i+1+M] != 'A' && chair[i-1+M] != 'A') {
			chair[i+M] = 'B';
			return;
		}
	}
	for(int i = 0; i < n; i++) {
		if(chair[i+M] == 'N') {
			chair[i+M] = 'B';
			return;
		}
	}
}

void C() {
	for(int i = 0; i < n; i++) {
		/*
		if(chair[i+M] == 'N' && (chair[i-1+M] != 'N' || chair[i+1+M] != 'N')) {
			chair[i+M] = 'C';
			return;
		}
		*/
		if(chair[i+M] != 'N') {
			if(chair[i+1+M] == 'N' && i+1 < n) {
				chair[i+1+M] = 'C';
				return;
			}
			else if(chair[i-1+M] == 'N' && i-1 >= 0) {
				chair[i-1+M] = 'C';
				return;
			}
		}
	}
	chair[n/2+M] = 'C';
}

void D() {
	int mx = 0;
	int indx = 0;
	for(int i = 0; i < n; i++) {
		if(chair[i+M] == 'N') {
			int mn = 1000;
			for(int j = 0; j < n; j++) {
				if(chair[j+M] != 'N') {
					if(mn > abs(j - i))
						mn = abs(j - i);
				}
			}
			if(mn > mx) {
				mx = mn;
				indx = i;
			}
		}
	}
	chair[indx+M] = 'D';
}

int main() {
	while(cin >> n >> m, n || m) {
		for(int i = 0; i < 128; i++)
			chair[i] = 'N';
		for(int i = 0; i < m; i++) {
			string s;
			cin >> s;
			if(s[0] == 'A')
				A();
			else if(s[0] == 'B')
				B();
			else if(s[0] == 'C')
				C();
			else
				D();
		}
		for(int i = 0; i < n; i++) {
			cout << (chair[i+M] == 'N' ? '#' : chair[i+M]);
		}
		cout << endl;
	}
}
accuracy: 1
time_ms: 10
memory_kb: 1196
final_rank: 3

code_snippet: #include <iostream>
#include <algorithm>

#define MAX 100

using namespace std;

int n,m;
char chair[MAX+2];
 
void A(){
  for(int i = 1 ; i <= n ; i++){
    if(chair[i] == '#'){
      chair[i] = 'A';
      return;
    }
  }
}

void B(){
  int pos = -1;
  
  for(int i = 1 ; i <= n ; i++){
    if(chair[i] == 'A'){
      pos = i;
      break;
    }
  }
  
  if(pos == -1){
    for(int i = n ; i > 0 ; i--){
      if(chair[i] == '#'){
        chair[i] = 'B';
        return;
      } 
    }
  }
  else{
    for(int i = n ; i > 0 ; i--){
      if(chair[i] == '#' && chair[i-1] != 'A' && chair[i+1] != 'A'){
	chair[i] = 'B';
	return;
      }
    }
 
    for(int i = 1 ; i <= n ; i++){
      if(chair[i] == '#'){
        chair[i] = 'B';
        return;
      }
    }
  }
}
 
void C(){
  int cnt = count(chair,chair+n,'#');
 
  if(cnt == n){
    if(n % 2){
      chair[(n+1)/2] = 'C';
    }
    else{
      chair[n/2+1] = 'C';
    }
  }
  else{
    for(int i = 1 ; i <= n ; i++){
      if(chair[i] != '#' && chair[i+1] == '#' && i != n){
        chair[i+1] = 'C';
        return;
      }
      if(chair[i] != '#' && chair[i-1] == '#' && i != 1){
        chair[i-1] = 'C';
        return;
      }
    }
  }
}
 
void D(){
  int Breadth = 0, pos;
  int cnt = count(chair,chair+n,'#');

  if(cnt == n){
    chair[1] = 'D';
    return;
  } 

  for(int i = 1 ; i <= n ; i++){
    int dist = (1<<29);
    if(chair[i] != '#') continue;
    for(int j = 1 ; j <= n ; j++){
      if(chair[j] != '#'){
        dist = min(dist,abs(j-i)+1);
      }
    }
    if(Breadth < dist){
      Breadth = dist;
      pos = i;
    } 
  }
 
  chair[pos] = 'D';
}
 
int main(){
  while(cin >> n >> m , n | m){
    char person;
 
    for(int i = 0 ; i <= n+1 ; i++){
      chair[i] = '#';
    }
 
    for(int i = 0 ; i < m ; i++){
      cin >> person;
      
      switch(person){
      case 'A': 
        A(); 
        break;
      case 'B': 
        B(); 
        break;
      case 'C': 
        C(); 
        break;
      case 'D': 
        D(); 
        break;
      }
 
    }
 
    for(int i = 1 ; i <= n ; i++){
      cout << chair[i];
    }
    cout << endl;
  }
 
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1148
final_rank: 1