input | output |
---|---|
4 BBAA BABB |
Bob |
3 AAA BBB |
Draw |
2 AA BB |
Alice |
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <bitset> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #define rep(i,m,n) for(i=m;i<=n;i++) #define mod 1000000007 #define inf 0x3f3f3f3f #define vi vector<int> #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) #define pii pair<int,int> #define Lson L, mid, ls[rt] #define Rson mid+1, R, rs[rt] #define sys system("pause") const int maxn=1e6+10; using namespace std; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;} inline void umax(int &p,int q){if(p<q)p=q;} inline void umin(int &p,int q){if(p>q)p=q;} inline ll read() { ll x=0;int f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int n,m,k,t,to[maxn]; char a[maxn]; int dfs(int l,int r,int cnt) { if(to[l]>=r) { if(a[l]==‘A‘)return 1; else return 2; } if((r-l+1)/2%2==1)return 0; int mid=l+r>>1,a=dfs(l,mid,cnt^1),b=dfs(mid+1,r,cnt^1); if(cnt==0) { if(a==1||b==1)return 1; else if(!a||!b)return 0; else return 2; } else { if(a==2||b==2)return 2; else if(!a||!b)return 0; else return 1; } } int main() { int i,j; scanf("%d%s",&n,a); scanf("%s",a+n); n<<=1; for(i=n-1;i>=0;i--) { if(a[i]==a[i+1])to[i]=to[i+1]; else to[i]=i; } int ok=dfs(0,n-1,0); if(ok==0)puts("Draw"); else if(ok==1)puts("Alice"); else puts("Bob"); return 0; }
原文:http://www.cnblogs.com/dyzll/p/6292601.html