大概就是dfs?当前区间(l,r)的答案可以由(l,m)和(m+1,r)区间推出,如果某个区间已经完全被某种颜色覆盖,那么就返回该颜色。否则按照递归层数判定,奇数层Alice占优势,只需左右区间中一者为必胜即可,而Bob需要左右区间均为其必胜色才可以。无解判一下即可。感觉还是很巧妙。
Input
Output
Example
input | output |
---|---|
4 BBAA BABB |
Bob |
3 AAA BBB |
Draw |
2 AA BB |
Alice |
#include<cstdio> int n,rsz[1000010]; char a[1000010]; int dfs(int l,int r,int dep) { if(rsz[l]>=r) { if(a[l]==‘A‘) return 1; if(a[l]==‘B‘) return 2; return 0; } if(((r-l+1)/2)%2!=0) return 0; int m=(l+r>>1); int f1=dfs(l,m,dep^1),f2=dfs(m+1,r,dep^1); if(!dep) { if(f1==1 || f2==1) return 1; if(f1==0 || f2==0) return 0; // if(f1==2 && f2==2) return 2; } else { if(f1==2 || f2==2) return 2; if(f1==0 || f2==0) return 0; // if(f1==1 && f2==1) return 1; } } int main() { //freopen("e.in","r",stdin); scanf("%d",&n); scanf("%s",a+1); scanf("%s",a+1+n); n<<=1; rsz[n]=n; for(int i=n-1;i>=1;--i) if(a[i]==a[i+1]) rsz[i]=rsz[i+1]; else rsz[i]=i; int f=dfs(1,n,0); if(f==0) puts("Draw"); else if(f==1) puts("Alice"); else puts("Bob"); return 0; }
【DFS】URAL - 2104 - Game with a Strip
原文:http://www.cnblogs.com/autsky-jadek/p/6304320.html