被这题卡了一整天,测试无数的数据,和对拍数据无误,几乎崩溃,后来重新敲时,发现自身写法的漏洞,果不其然,就是这个潜伏多年的bug,在ural,poj,以及我的vim下得出的数据都是一样的,我现在有些明白,为什么以前出现过在G++AC的题目,到C++是wa,应该是写法上的漏洞,编译器不同结果是不同的,改完这个bug,就AC了,rank排到第一去了。
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
6866154 | 2012-10-04 23:01:27 | Accepted | 4285 | 1937MS | 12352K | 4430 B | G++ | xym2010 |
#include<cstdio> #include<cstring> #include<string> #include<cmath> #include<iostream> #include<algorithm> #define LL int using namespace std; const int maxn=30001,mod=1000000007; int mov[14]={0,2,4,6,8,10,12,14,16,18,20,22,24,26}; struct node { int size,head[maxn],next[maxn]; LL sta[maxn],sum[maxn]; void clear() { memset(head,-1,sizeof(head)); size=0; } void push(LL st,const LL v) { LL hash=st%maxn; for(int i=head[hash];i>=0;i=next[i]) { if(sta[i]==st) { sum[i]+=v; if(sum[i]>=mod) sum[i]-=mod; return ; } } sta[size]=st,sum[size]=v; next[size]=head[hash],head[hash]=size++; } }dp[2][37]; inline LL getbit(LL st,int k){return 3&(st>>mov[k]);} inline LL pybit(LL st,int k){return st<<mov[k];} inline LL clrbit(LL st,int a,int b){return st&(~(3<<mov[a]))&(~(3<<mov[b]));} inline LL fl(LL st,int k,int n) { int cnt=1; for(int i=k+1;i<=n;i++) { LL e=getbit(st,i); if(e==2) cnt--; else if(e==1) cnt++; if(cnt==0) return i; } } inline LL fr(LL st,int k) { int cnt=1; for(int i=k-1;i>=0;i--) { LL e=getbit(st,i); if(e==2) cnt++; else if(e==1) cnt--; if(cnt==0) return i; } } inline LL count(LL st,int k) { int cnt=0; for(int i=k-1;i>=0;i--) { if(getbit(st,i)) cnt++; } return cnt; } int n,m,c,sx,sy; char gp[20][20]; void tran(int &pre,int &now,bool flag) { pre=now,now^=1; for(int j=0;j<=c;j++) dp[now][j].clear(); if(flag) { for(int j=0;j<=c;j++) for(int k=0;k<dp[pre][j].size;k++) dp[now][j].push(dp[pre][j].sta[k]<<2,dp[pre][j].sum[k]); } } LL DP() { int now=1,pre=0; tran(pre,now,0); dp[0][0].push(0,1); for(int i=1;i<=n;i++) { if(i>sx)break; tran(pre,now,1); for(int j=1;j<=m;j++) { if(i==sx&&j>sy)break; tran(pre,now,0); for(int k=0;k<c;k++) { for(int x=0;x<dp[pre][k].size;x++) { LL l=getbit(dp[pre][k].sta[x],j-1); LL up=getbit(dp[pre][k].sta[x],j); LL st=clrbit(dp[pre][k].sta[x],j,j-1); if(!l&&!up) { if(gp[i][j]=='*') dp[now][k].push(st,dp[pre][k].sum[x]); else if(i<n&&j<m&&gp[i+1][j]=='.'&&gp[i][j+1]=='.') dp[now][k].push(st|pybit(1,j-1)|pybit(2,j),dp[pre][k].sum[x]); } else if(!l||!up) { int e=l==0?up:l; if(i<n&&gp[i+1][j]=='.') dp[now][k].push(st|pybit(e,j-1),dp[pre][k].sum[x]); if(j<m&&gp[i][j+1]=='.') dp[now][k].push(st|pybit(e,j),dp[pre][k].sum[x]); } else if(l==1&&up==1) dp[now][k].push(st^pybit(3,fl(st,j,m)),dp[pre][k].sum[x]); else if(l==2&&up==2) dp[now][k].push(st^pybit(3,fr(st,j-1)),dp[pre][k].sum[x]); else if(l==2&&up==1) dp[now][k].push(st,dp[pre][k].sum[x]); else if((count(st,j-1)&1)==0)dp[now][k+1].push(st,dp[pre][k].sum[x]); } } } } int ans=0; for(int i=0;i<dp[now][c].size;i++) if(dp[now][c].sta[i]==0) ans+=dp[now][c].sum[i]; return ans; } int main() { int t,T=1; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&c); for(int i=1;i<=n;i++) scanf("%s",&gp[i][1]); bool flag=0; for(int i=n;i>=1&&!flag;i--) { for(int j=m;j>=1&&!flag;j--) if(gp[i][j]=='.') flag=1,sx=i,sy=j; } if(!flag) { if(c==0) puts("1"); else puts("0"); } else if(c>(n*m)/4||(flag&&c==0)) puts("0"); else cout<< DP()<<'\n'; } return 0; }