提交时间:2026-05-27 15:38:03
运行 ID: 41683
#include<bits/stdc++.h> using namespace std; using ll=long long; using vi=vector<ll>; using vii=vector<vi>; using vi3=vector<vii>; using vi4=vector<vi3>; const int mod=1e9+7; int n,m;bool o=0; vii a;vii ans; void input(){ if(!o){ for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ char ch;cin>>ch; a[i][j]=ch-'0'; } } }else{ for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ char ch;cin>>ch; a[j][i]=ch-'0'; } } } } void output(){ if(!o){ for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ char ch;cin>>ch; cout<<ans[i][j]<<' '; }cout<<'\n'; } }else{ for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ cout<<ans[j][i]<<' '; }cout<<'\n'; } } } //vi4 f; int U; vii pre,suf; vi3 f;vi tmp; int DP(){ auto clear=[&](){for(auto &x:f)for(auto &y:x)for(auto &z:y)z=0;}; auto getf=[&](int i,int j){ for(int k=0;k<=U;k++){ int s; //case 1 : 1*1 s=k|(1<<(j-1)); f[j][s][0]+=f[j-1][k][0]+f[j-1][k][1]+f[j-1][k][2]; //case 2 : x*1 if(a[i][j]==a[i][j-1]){ //case 2.1 : x*1 if(f[j-1][k][1]){ s=k&(U^(1<<(j-1))); f[j][s][1]+=f[j-1][k][1]; } //case 2.2 : 1*1 if(f[j-1][k][0]){ s=k&(U^(1<<(j-1)));s^=(1<<(j-2));//j-1 \neq 0 f[j][s][1]+=f[j-1][k][0]; } } //case 3 : 1*x if(a[i][j]==a[i-1][j]&&((k>>(j-1))&1)){ s=k; f[j][s][2]+=f[j-1][k][0]+f[j-1][k][1]+f[j-1][k][2]; } } for(int k=0;k<=U;k++){ f[j][k][0]%=mod;f[j][k][1]%=mod;f[j][k][2]%=mod; } }; //get - pre clear();f[0][0][2]=1; //0:1*1 1:x*1 2:1*x for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ getf(i,j); } for(auto &ed:tmp) ed=0; for(int j=0;j<=U;j++){ int now=0; for(int o=0;o<3;o++){ now=(now+f[m][j][o])%mod; }tmp[j]=now; }clear(); for(int j=0;j<=U;j++) f[0][j][2]=tmp[j]; } int ans=0; for(int i=0;i<=U;i++){ ans=(ans+f[0][i][2])%mod; }return ans; } int main(){ //freopen("disanti.in","r",stdin); //freopen("disanti.out","w",stdout); cin>>n>>m; if(n<m) o=1,swap(n,m); a=vii(n+2,vi(m+2,0));ans=a; input();U=(1<<m)-1; f=vi3(m+2,vii(U+10,vi(3,0)));tmp=vi(U+10,0); //f=vi4(n+2,vi3(m+2,vii(U+10,vi(3,0)))); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ a[i][j]^=1; ans[i][j]=DP(); a[i][j]^=1; } } output(); return 0; }