Description
给定两个串SSS和TTT,∣S∣≥∣T∣|S|\ge |T|∣S∣≥∣T∣。
alicealicealice和bobbobbob轮流操作串SSS,bobbobbob先手。
对于每次操作,alicealicealice或bobbobbob会选择删掉SSS的第一位或最后一位。
当操作以后的串的长度等于∣T∣|T|∣T∣时,游戏停止。
如果停止时的串=T=T=T,则alicealicealice获胜,否则bobbobbob获胜。
问在alicealicealice和bobbobbob均采取最优策略的情况下,谁赢?
Input
第一行一个整数TTT表示数据组数。
接下来TTT行每行两个整数字符串S,TS, TS,T。
(T≤1000,1≤∣T∣≤∣S∣≤5⋅105,∑(∣S∣+∣T∣)≤106)(T\le 1000,1\le |T|\le |S|\le 5\cdot 10^5,\sum(|S|+|T|)\le 10^6)(T≤1000,1≤∣T∣≤∣S∣≤5⋅105,∑(∣S∣+∣T∣)≤106)
Output
TTT行。对于每组数据,alicealicealice赢输出′Alice′'Alice'′Alice′,$ bob赢输出赢输出赢输出’Bob’$。
Sample Input
5
aba b
bab b
aaab aab
xyz mnk
xyz xyz
Sample Output
Alice
Alice
Bob
Bob
Alice
Solution
一.若∣S∣=∣T∣|S|=|T|∣S∣=∣T∣,此时S=TS=TS=T则后手胜,否则先手胜
二.若∣S∣>∣T∣|S|>|T|∣S∣>∣T∣,记n=∣S∣,m=∣T∣,t=n−mn=|S|,m=|T|,t=n-mn=∣S∣,m=∣T∣,t=n−m,那么先手可以操作x=⌈t2⌉x=\lceil\frac{t}{2}\rceilx=⌈2t⌉次,后手可以操作y=⌊t2⌋y=\lfloor\frac{t}{2}\rfloory=⌊2t⌋次,记[li,ri][l_i,r_i][li,ri]为SSS中所有可以与TTT匹配的区间,那么有li−1+n−ri=tl_i-1+n-r_i=tli−1+n−ri=t
1.若ttt为偶数,那么x=yx=yx=y,我们首先证明先手必然可以破坏所有满足li−1̸∈[x−1,x+1]l_i-1\not\in[x-1,x+1]li−1̸∈[x−1,x+1]的匹配,先手首先任选一边删去一个,之后后手删哪边先手就删另一边,这样可以保证两边都至少删去了x−1x-1x−1次,那么所有这种匹配都会因为li−1<x−1l_i-1<x-1li−1<x−1或n−ri<x−1n-r_i<x-1n−ri<x−1被破坏
注意到先手可以破坏一边至多xxx次,故对于li−1=xl_i-1=xli−1=x的匹配显然可以保存下来,但是对于li−1=x±1l_i-1=x\pm 1li−1=x±1的情况,如果只存在一个匹配满足该条件,那么先手只需尽可能删除一边即可破坏该匹配,故此时必须至少存在两个匹配使得li−1=x−1,lj−1=x+1l_i-1=x-1,l_j-1=x+1li−1=x−1,lj−1=x+1,如此先手无论怎么删都至少会有一个匹配保存下来
2.若ttt为奇数,那么x=y+1x=y+1x=y+1,同理至少需要两个匹配使得li−1=x,lj−1=x+1l_i-1=x,l_j-1=x+1li−1=x,lj−1=x+1,这样先手无论删哪一边,只要后手删另一边,就可以保证至少有一个匹配保存下来
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=500005;
int T,n,m;
char s[maxn],t[maxn];
bool check(int x)
{
for(int i=x+1,j=1;j<=m;i++,j++)
if(s[i]!=t[j])return 0;
return 1;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%s%s",s+1,t+1);
n=strlen(s+1),m=strlen(t+1);
int flag=0;
if(n==m)
{
if(strcmp(s+1,t+1)==0)flag=1;
}
else
{
if((n-m)&1)
{
if(check((n-m)/2)&&check((n-m)/2+1))flag=1;
}
else
{
if(check((n-m)/2)||check((n-m)/2-1)&&check((n-m)/2+1))flag=1;
}
}
if(flag)printf("Alice\n");
else printf("Bob\n");
}
return 0;
}