列表

详情


NC15874. 玩游戏

描述

给定两个串S和T,|S| >= |T|。
alice和bob轮流操作串S,bob先手。
对于每次操作,alice或bob会选择删掉S的第一位或最后一位。
当操作以后的串的长度等于|T|时,游戏停止。
如果停止时的串=T,则alice获胜,否则bob获胜。
问在alice和bob均采取最优策略的情况下,谁赢?

输入描述

第一行一个整数T(T <= 1000)表示数据组数。
接下来T行每行两个整数字符串S, T。 (1 <= |S| <= |T| <= 500000,S和T均由小写字母构成)
字符串总长度 <= 1000000

输出描述

T行。
对于每组数据,alice赢输出'Alice', bob赢输出'Bob'。

示例1

输入:

5
aba b
bab b
aaab aab
xyz mnk
xyz xyz

输出:

Alice
Alice
Bob
Bob
Alice

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 27ms, 内存消耗: 1924K, 提交时间: 2018-05-28 13:22:20

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n; cin>>n;
    while(n--){
        string s,t;
        cin>>s>>t;
        bool ok=false;
        int stID=(s.length()-t.length())/2;

        if (s.length()==t.length()){
            ok=s==t;
        }
        else if ((s.size()-t.size())%2){
            ok=s.substr(stID,t.size())==t&&s.substr(stID+1,t.size())==t;
        }
        else{
            ok=s.substr(stID,t.size())==t||(s.substr(stID-1,t.size())==t&&s.substr(stID+1,t.size())==t);
        }
        if (ok) cout<<"Alice"<<endl;
        else cout<<"Bob"<<endl;
    }

    return 0;
}

C++ 解法, 执行用时: 5ms, 内存消耗: 1304K, 提交时间: 2021-07-30 20:15:35

#include<bits/stdc++.h>
using namespace std;
const int MAX=5e5+5;
char s[MAX],t[MAX];
int s1,t1;
bool check(int x)
{
	for(int j=0;j<t1;j++)
		if(s[j+x]!=t[j])
			return 0;
	return 1;
}
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int k,f;
		scanf("%s %s",s,t);
		s1=strlen(s),t1=strlen(t);
		k=s1-t1+1;
		if(k==1)f=check(0);
		else if(k&1)f=(check(k/2-1)&check(k/2+1)|check(k/2));
		else f=(check(k/2-1)&check(k/2));
		puts(f? "Alice":"Bob");
	}
}

上一题