爱丽丝和鲍勃正在玩一个游戏。
他们每个人都有一个号码。Alice的号码是A,Bob的号码是B.
每回合,一名球员可以对自己的号码执行以下操作之一:
1.翻转:翻转号码。假设X = 123456,翻转后X = 654321
2.划分。X = X / 10。注意所有的数字都是整数。例如X = 123456,在这个动作之后X变为12345(但不是12345.6)。0/0 = 0。
Alice和Bob依次移动,Alice先移动。爱丽丝只能修改A,鲍勃只能修改B.如果A = B后任何玩家的动作,则爱丽丝赢。否则,游戏继续!
爱丽丝想赢得比赛,但鲍勃会尽力阻止爱丽丝。
假设Alice和Bob足够聪明,现在Alice想知道她是否能以有限的步骤赢得比赛,否则游戏永远不会结束。
第一行包含一个整数T(1≤T≤10),表示有T个测试用例。
对于每个测试用例:两个数字A和B. 0 <= A,B <= 10 ^ 100000。
对于每个测试案例,如果爱丽丝可以赢得游戏,输出“爱丽丝”。否则输出“Bob”。
4 11111 1 1 11111 12345 54321 123 123示例输出
爱丽丝 短发 爱丽丝 爱丽丝暗示
对于第三个样本,Alice翻转他的号码并赢得比赛。
对于最后一个样本,A = B,所以即使没有人采取行动,爱丽丝也会立即赢得比赛。
①首先将Bob的数字串去掉后缀0.
②然后判断Bob的数字串是否为0.如果是输出Alice否则进入步骤③
③将Alice的数字串和Bob的数字串进行KMP匹配,正反各一次即可,如果包含了Bob的数字串,输出Alice,否则输出Bob.
#include <iostream>
#include<stdio.h>#include<algorithm>
#include<string.h>
using namespace std;
char a[10000005],b[10000005],c[10000005];
int f[10000005];
int main()
{
int n;
long long int d,e,i,j;
scanf("%d",&n);
while(n--)
{
int ge=0;
scanf("%s%s",a,b);
d=strlen(a);
e=strlen(b);
for(i=e-1; i>=0; i--)
if(b[i]=='0')
{
ge++;
b[i]=0;
}
else
break;
e=e-ge;
if(b[0]==0)
printf("Alice\n");
else
{
f[0]=-1;
for(i=1; i<=e-1; i++)
{
j=f[i-1];
while(b[j+1]!=b[i]&&j>=0)
j=f[j];
if(b[j+1]==b[i])
f[i]=j+1;
else
f[i]=-1;
}
i=0;
j=0;
int z=1;
while(i<d)
{
if(a[i]==b[j])
{
i++;
j++;
if(j==e)
{
z=2;
break;
}
}
else
{
if(j==0)
i++;
else
j=f[j-1]+1;
}
}
if(z==2)
printf("Alice\n");
else
{
reverse(b,b+e);
i=0;
j=0;
int z1=1;
while(i<d)
{
if(a[i]==b[j])
{
i++;
j++;
if(j==e)
{
z1=2;
break;
}
}
else
{
if(j==0)
i++;
else
j=f[j-1]+1;
}
}
if(z1==2)
printf("Alice\n");
else
printf("Bob\n");
}
}
}
return 0;
}