Problem:
Score : 700 points

Problem Statement

For strings s and t, we will say that s and t are prefix-free when neither is a prefix of the other.

Let L be a positive integer. A set of strings S is a good string set when the following conditions hold true:

Each string in S has a length between 1 and L (inclusive) and consists of the characters 0 and 1.

Any two distinct strings in S are prefix-free.

We have a good string set S = \{ s_1, s_2, ..., s_N \}. Alice and Bob will play a game against each other. They will alternately perform the following operation, starting from Alice:

Add a new string to S. After addition, S must still be a good string set.

The first player who becomes unable to perform the operation loses the game. Determine the winner of the game when both players play optimally.

Constraints

1 \leq N \leq 10^5

1 \leq L \leq 10^{18}

s_1, s_2, ..., s_N are all distinct.

{ s_1, s_2, ..., s_N } is a good string set.

|s_1| + |s_2| + ... + |s_N| \leq 10^5

Input

Input is given from Standard Input in the following format:

N L
s_1
s_2
:
s_N

Output

If Alice will win, print Alice; if Bob will win, print Bob.

Sample Input 1

2 2
00
01

Sample Output 1

Alice

If Alice adds 1, Bob will be unable to add a new string.

Sample Input 2

2 2
00
11

Sample Output 2

Bob

There are two strings that Alice can add on the first turn: 01 and 10.
In case she adds 01, if Bob add 10, she will be unable to add a new string.
Also, in case she adds 10, if Bob add 01, she will be unable to add a new string.

Sample Input 3

3 3
0
10
110

Sample Output 3

Alice

If Alice adds 111, Bob will be unable to add a new string.

Sample Input 4

2 1
0
1

Sample Output 4

Bob

Alice is unable to add a new string on the first turn.

Sample Input 5

1 2
11

Sample Output 5

Alice

Sample Input 6

2 3
101
11

Sample Output 6

Bob

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include "bits/stdc++.h"
using namespace std;

#define DEBUG(x) cout<<#x<<": "<<x<<endl;
#define DEBUG_VEC(v) cout<<#v<<":";for(int i=0;i<v.size();i++) cout<<" "<<v[i]; cout<<endl

typedef long long ll;
#define vi vector<int>
#define vl vector<ll>
#define vii vector< vector<int> >
#define vll vector< vector<ll> >
#define vs vector<string>
#define pii pair<int,int>
#define pis pair<int,string>
#define psi pair<string,int>
#define pll pair<ll,ll>
const int inf = 1000000001;
const ll INF = 1e18 * 2;
#define MOD 1000000007
#define mod 1000000009
#define pi 3.14159265358979323846
#define Sp(p) cout<<setprecision(15)<< fixed<<p<<endl;
int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,1,0,-1 };
int dx2[8] = { 1,1,0,-1,-1,-1,0,1 }, dy2[8] = { 0,1,1,1,0,-1,-1,-1 };

const int charnum = 2;
const char firstchar = '0';

class Trie {
public:
	Trie *next[charnum];

	Trie() {
		fill(next, next + charnum, (Trie *)NULL);
	}

	/*
	void insert(char *s) {
		if (*s == '\0') return;
		if (this->next[*s - 'a'] == NULL)
			this->next[*s - 'a'] = new Trie();
		this->next[*s - 'a']->insert(s + 1);
	}
	*/
	void insert(string s) {
		Trie* now = this;
		for (int i = 0; i < s.size(); i++) {
			if (now->next[s[i] - firstchar] == NULL) {
				now->next[s[i] - firstchar] = new Trie();
			}
			now = now->next[s[i] - firstchar];
		}
	}

	/*
	bool find(char *s) {
		if (*s == '\0') return true;
		if (this->next[*s - 'a'] == NULL)
			return false;
		return this->next[*s - 'a']->find(s + 1);
	}
	*/
	bool find(string s) {
		Trie* now = this;
		for (int i = 0; i < s.size(); i++) {
			if (now->next[s[i] - firstchar] == NULL)
				return false;
			now = now->next[s[i] - firstchar];
		}
		return true;
	}
};

int n, l;
ll grundy = 0;

void dfs(Trie* now, int d) {
	if (now->next[0] == NULL && now->next[1] == NULL) {
		return;
	}
	else if (now->next[0] != NULL && now->next[1] != NULL) {
		dfs(now->next[0], d + 1);
		dfs(now->next[1], d + 1);
		return;
	}
	else if (now->next[0] == NULL) {
		grundy ^= (l - d) & (-l + d);
		dfs(now->next[1], d + 1);
		return;
	}
	else {
		grundy ^= (l - d) & (-l + d);
		dfs(now->next[0], d + 1);
		return;
	}
}


int main() {
	cin >> n >> l;
	int i, j;
	Trie* t = new Trie();
	for (i = 0; i < n; i++) {
		string s;
		cin >> s;
		t->insert(s);
	}
	dfs(t, 0);
	if (grundy == 0) {
		cout << "Bob" << endl;
	}
	else {
		cout << "Alice" << endl;
	}
}