记录编号 |
164028 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[Ural 1519] 一级方程式赛车 |
最终得分 |
100 |
用户昵称 |
天一阁 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.241 s |
提交时间 |
2015-05-27 19:30:52 |
内存使用 |
7.46 MiB |
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
#define c(w,i) (((w)>>((i)<<1))&3)
#define N 100010
#define LL long long
using namespace std;
struct HASH{
#define size 1007
int totE,s[N],g[size],to[N];
LL f[N];
void init(){
memset(g,0,sizeof(g));
totE=0;
}
inline void addin(int t,LL v){
int x=t%size;
for(int i=g[x];i;i=to[i])
if(s[i]==t){f[i]+=v; return;}
s[++totE]=t; to[totE]=g[x];
g[x]=totE; f[totE]=v;
}
}hm[2],*last,*now;
int n,m,num[4]={0,1,-1,0},X=-1,Y=-1;
char mp[21][21];
inline int findL(int w,int i){
int cnt=-1,ans=i;
while(cnt){
ans--;
cnt+=num[c(w,ans)];
}
return ans;
}
inline int findR(int w,int i){
int cnt=1,ans=i;
while(cnt){
ans++;
cnt+=num[c(w,ans)];
}
return ans;
}
inline void setb(int &w,int i,int v){
w = (w&~(3<<(i<<1)))|(v<<(i<<1));
}
inline bool check(int i,int j){
return i==X&&j==Y;
}
inline void update(int i,int j,int w,LL v){
int lf= (j==0)?0:c(w,j);
int up= (i==0)?0:c(w,j+1);
int tmp=w;
if(mp[i][j]=='*'){
if(!lf&&!up) now->addin(w,v);
return;
}
if(!lf&&!up){ //'##' -> '()'
if(i==n-1||j==m-1) return; //error
setb(tmp,j,1);
setb(tmp,j+1,2);
now->addin(tmp,v);
}
else{
if(!lf||!up){ //'(#' -> '#(' or '(#'
if(j!=m-1){ //error
tmp=w;
setb(tmp,j,0);
setb(tmp,j+1,lf|up);
now->addin(tmp,v);
}
if(i!=n-1){
tmp=w;
setb(tmp,j,lf|up);
setb(tmp,j+1,0);
now->addin(tmp,v);
}
}
else{
tmp=w;
setb(tmp,j,0);
setb(tmp,j+1,0);
if(lf==1&&up==1){ //'(( - ))' -> '## - ()'
setb(tmp,findR(w,j+1),1);
now->addin(tmp,v);
}
else if(lf==1){ //'()' -> '##'
if(!check(i,j)) return; //error
now->addin(tmp,v);
} //')(' -> '##'
else if(up==1) now->addin(tmp,v);
else{ //'(( - ))' -> '() - ##'
setb(tmp,findL(w,j),2);
now->addin(tmp,v);
}
}
}
}
void solve(int n,int m){
now=hm; last=hm+1;
last->init();
last->addin(0,1);
for(int i=0;i<n;i++){
for(int k=1;k<=last->totE;k++)
last->s[k]<<=2;
for(int j=0;j<m;j++){
now->init();
for(int k=1;k<=last->totE;k++)
update(i,j,last->s[k],last->f[k]);
swap(now,last);
}
}
LL ans=0;
for(int i=1;i<=last->totE;i++)
if(last->s[i]==0){
ans=last->f[i];
break;
}
printf("%lld\n",ans);
}
int main(){
freopen("formula1.in","r",stdin);
freopen("formula1.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%s",mp[i]);
for(int i=n-1;~i;i--){
for(int j=m-1;~j;j--)
if(mp[i][j]=='.'){
X=i; Y=j; break;
}
if(~X) break;
}
if(~X) solve(n,m);
else puts("0");
return 0;
}