NC15874. 玩游戏
描述
输入描述
第一行一个整数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"); } }