【ZCMU1893】String Game(博弈)

记录一个菜逼的成长。。

题目链接

题目大意:
给你两个串a,b,a的长度不小于b
现在有两个人A,B,每次可以选择在a的头或尾删除一个字符,由B先。
直到a的长度等于b,如果此时a与b相等则A赢

可以分为三种情况讨论。
1.如果a的长度等于b 就直接看a是否和b相等。
2.如果a的长度减去b的长度是奇数
说明B的操作次数比A多一次。假设A的操作次数是ope
假设b在a的内部 如果B要赢,那么B一定会一直在头或一直在尾删除字符。(仔细想一想。。)
而A想要赢,那么A要删除的字符位置肯定要跟B不相同。
那么要判断B在头删除ope+1个字符,A在尾删除ope个字符后,是否等于b
并且还要判断B在尾删除ope+1个字符,A在头删除ope个字符后,是否等于b
这两个要同时成立
3.如果a的长度减去b的长度是偶数
说明B的操作次数跟A一样
那么要判断在头和尾各删去ope个字符后是否和b相等
或者
在B操作完最后一次后,A在B删除的位置再删除一个字符
比如abababa ababa
那么要判断B在头删除ope个字符,A在头删除一个字符,在尾删除ope-1个字符是否与b相等
以及判断B在尾删除ope个字符,A在尾删除一个字符,在头删除ope-1个字符是否与b相等。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 10;
int main()
{
    string a,b;
    int T;
    scanf("%d",&T);
    while(T--){
        cin>>a>>b;
        bool ans = false;
        int ope = (a.length() - b.length()) / 2;
        if(a.length() == b.length()){
            ans = (a == b);
        }
        else if((a.length() - b.length()) % 2){
            if(a.substr(ope,b.length()) == b && a.substr(ope+1,b.length()) == b)ans = true;
        }
        else {
            if(a.substr(ope,b.length()) == b)ans = true;
            if(a.substr(ope-1,b.length()) == b && a.substr(ope+1,b.length()) == b)ans = true;
        }
        puts(ans?"Alice":"Bob");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值