题目链接:http://acm.fzu.edu.cn/contest/problem.php?cid=156&sortid=4
题目大意:又见Alice Bob,1.数字反转 2.数字除十 每次每个人只能选择一个操作,问在有限的次数能谁能取得胜利。
题目思路:只要找完Alice胜利的所有状态,那么剩下的都是Bob胜利。
Alice胜利的情况:1.Bob是Alice的子串或者Bob是Alice逆置的子串
2.当Bob的字符串长度为1且字符串的内容为0
学到的东西:Alice Bob = 博弈论 ,数字这么长,想想kmp
代码:
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
const int maxn=10000;
int fail[maxn];
void getFail(string zi)
{
fail[0]=0,fail[1]=0;
for(int i=1;i<zi.size();i++){
int j=fail[i];
while(j&&zi[i]!=zi[j])
j=fail[j];
fail[i+1]=zi[i]==zi[j]?j+1:0;
}
}
bool kmp(string fu,string zi)
{
getFail(zi);
int j=0;
for(int i=0;i<fu.size();i++){
while(j&&zi[j]!=fu[i]) j=fail[j];
if(zi[j]==fu[i]) j++;
if(j==zi.size()) return true;
}
return false;
}
int main()
{
string fu;
string zi;
string fu2;
int t;cin>>t;
while(t--){
bool is=false;
cin>>fu>>zi;
if(fu.size()>=zi.size()){
is=kmp(fu,zi);
if(!is){
for(int j=fu.size()-1;j>=0;j--)
fu2.push_back(fu[j]);
is = kmp(fu2,zi);
}
}
if(zi.size()==1&&zi[0]=='0') is = true;
if(is) cout<<"Alice"<<endl;
else cout<<"Bob"<<endl;
}
}