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<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define fi first
#define se second
#define pb push_back
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,b) for (int i=a; i<=b; i++)
#define per(i,a,b) for (int i=a; i>=b; i--)
#define L(i,u) for (int i=head[u]; i!=0; i=edge[i].nxt)
#define abs(a) ((a)>0 ? (a) : -(a))
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int,int> Pii;
typedef vector<int> Vi;
typedef long long ll;
typedef long double ld;
const int N = 133333;
ll n,l;

inline void read(ll &x) {
	x=0; char c=getchar(); int f=1;
	while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
	while (c>='0'&&c<='9') {x=10*x+c-'0'; c=getchar();} x*=f;
}
bool sg(int gou, int cha) {
	if (gou&1) return 1;
	return cha&1;
}
inline int f(ll n) {
	if (n==1||n==3||n==4) return 0;
	return 1;
}
int ch[N][2],size,dep[N];
inline void insert(char *s, int len) {
	int now=0;
	rep(i,1,len) {
		int c=s[i]-'0';
		if (!ch[now][c]) {ch[now][c]=++size; dep[size]=i;}
		now=ch[now][c];
	}
}
ll s[N],len;
int main() { //freopen("1.in","r",stdin);
	read(n); read(l);
	char st[N];
	rep(i,1,n) {
		scanf("%s",st+1); int l=strlen(st+1);
		insert(st,l);
	}
	rep(i,0,size) if ((ch[i][0]>0)^(ch[i][1]>0)&&l>dep[i]) s[++len]=l-dep[i];
//	printf("%d %d %d\n",len,s[1],s[2]);
	int gou=0,cha=0;
	rep(i,1,size)
		if (f(s[i])) gou++; else cha++;
	bool flag=sg(gou,cha);
	if (flag) puts("Alice"); else puts("Bob");
	/*f[1]=0; f[2]=1;
	rep(i,3,100) {
		int gou=0,cha=0;
		per(j,i-1,1) {
			if (f[j]) gou++; else cha++;
			f[i]|=!sg(gou,cha);
		}
		printf("%d:%d\n",i,f[i]);
	}*/
	return 0;
}