题目大意就是给Alice和Bob一人一个字符串,每个人每回合可以对自己的字符串进行两种操作中的一种,反转字符串或删除字符串末尾的那个数,字符串删完将变为“0”
正反KMP两次就好了,如果Alice的字符串包含了Bob的字符串或者包含了Bob翻转后的字符串,那么Alice就可以向Bob步步逼近最后取得胜利,注意题目说的是双方任意一人操作后若两人字符串相同则Alice胜利(一开始还看错了以为必须得是Alice操作完才算胜利)
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char t[100005];
char w[100005];
int Next[100005];
int lent,lenw;
void getnext()
{
Next[0]=Next[1]=0;
for(int i=1;i<lenw;i++)
{
int j=Next[i];
while(j&&w[i]!=w[i])
j=Next[j];
if(w[i]==w[j])
Next[i+1]=j+1;
else
Next[i+1]=0;
}
}
bool kmp()
{
int j=0;
for(int i=0;i<lent;i++)
{
while(j&&t[i]!=w[j])
j=Next[j];
if(t[i]==w[j])
j++;
if(j==lenw)
return true;
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",t,w);
lent=strlen(t);
lenw=strlen(w);
if(lent<lenw)
{
printf("Bob\n");
continue;
}
if(lenw==1&&w[0]=='0')
{
printf("Alice\n");
continue;
}
getnext();
if(kmp())
printf("Alice\n");
else
{
strrev(w);
getnext();
if(kmp())
printf("Alice\n");
else
printf("Bob\n");
}
}
return 0;
}