模板题求调
  • 板块灌水区
  • 楼主_FJqwq
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/12/17 14:43
  • 上次更新2023/10/24 07:26:43
查看原帖
模板题求调
755947
_FJqwq楼主2022/12/17 14:43

题目

ll n,m,ex,ey,now,last,ans,a[105][105],mod=300005,head1[300005],nxt[2<<24],b[2][2<<24],v[2][2<<24],len[2],res[15];
char s[105][105];
/*哈希表板子 */
void insert(ll bit,ll d)
{
	ll u=bit%mod+1;
	for(ll i=head1[u];i;i=nxt[i])
		if(b[now][i]==bit)
		{
			v[now][i]+=d;
			return ;
		}
	nxt[++len[now]]=head1[u];
	head1[u]=len[now];
	b[now][len[now]]=bit;
	v[now][len[now]]=d;
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++)
		scanf(" %s",s[i]+1);
	for(ll i=1;i<=n;i++)
		for(ll j=1;j<=m;j++)
			if(s[i][j]=='.')
				a[i][j]=1,ex=i,ey=j;
	res[0]=1;
	for(ll i=1;i<=13;i++)
		res[i]=res[i-1]<<2;
	len[now]=1,v[now][1]=1,b[now][1]=0;
	for(ll i=1;i<=n;i++)
	{ 
		for(ll j=1;j<=len[now];j++)
			b[now][j]<<=2;
		for(ll j=1;j<=m;j++)
		{
			memset(head1,0,sizeof head1);
			last=now;now^=1;
			len[now]=0;
			for(ll k=1,bit,d,b1,b2;k<=len[last];k++)
			{
				bit=b[last][k],d=v[last][k];
				b1=(bit>>((j-1)<<1))%4,b2=(bit>>(j<<1))%4;
//				printf("%lld.%lld.%lld.%lld\n",bit,d,b1,b2);
				if(!a[i][j])
				{
					if((!b1)&&(!b2))
						insert(bit,d);
				}
				else
					if((!b1)&&(!b2))
					{
						if(a[i+1][j]&&a[i][j+1])
							insert(bit^(res[j]<<1)^res[j-1],d);
					}
					else
						if((!b1)&&b2)
						{
							if(a[i][j+1])
								insert(bit,d);
							else
								if(a[i+1][j])
									insert(bit^(res[j]*b2)^(res[j-1]*b2),d);
						}
						else
							if(b1&&(!b2))
							{
								if(a[i+1][j])
									insert(bit,d);
								else
									if(a[i][j+1])
										insert(bit^(res[j]*b1)^(res[j-1]*b1),d);
							}
							else
								if(b1==1&&b2==1)
								{
									ll l=1;
									for(ll p=j+1;p<=m;p++)
									{
										if((bit>>(p<<1))%4==1)
											l++;
										if((bit>>(p<<1))%4==2)
											l--;
										if(!l)
										{
											insert(bit^res[j]^res[j-1]^res[p],d);
											break;
										}
									}
								}
								else
									if(b1==2&&b2==2)
									{
										ll r=1;
										for(ll p=j-2;p>=0;p--)
										{
											if((bit>>(p<<1))%4==2)
												r++;
											if((bit>>(p<<1))%4==1)
												r--;
											if(!r)
											{
												insert(bit^(res[j]<<1)^(res[j-1]<<1)^res[p],d);
												break;
											}
										}
									}
									else
										if(b1==2&&b2==1)
											insert(bit^res[j]^(res[j-1]<<1),d);
										else
											if(b1==1&&b2==2)
											{
												if(i==ex&&j==ey)
													ans+=d;
											}
											else
												return puts("WTF"),0;
			}
		}
	}
	return printf("%lld\n",ans),0; 
}

thx

2022/12/17 14:43
加载中...