题目链接.
dp[i][j]代表上一位的高八位数为i,低八位数&j=0.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll mod=998244353;
int n,m;
ll dp[(1<<8)+10][(1<<8)+10];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
ll ans=0;
while(n--)
{
string s;cin>>s;
ll a=0;
for(int i=0;i<m;i++)
{
a=(a<<1)+(s[i]=='o');
}
ll x=a>>8;
ll y=255&a;
ll res=1;
for(int i=0;i<(1<<8);i++)
{
if(!(i&x))
{
res=(res+dp[i][y])%mod;
}
}
ans=(ans+res)%mod;
for(int i=0;i<(1<<8);i++)
{
if(!(i&y))
{
dp[x][i]=(dp[x][i]+res)%mod;
}
}
}
cout<<ans<<"\n";
return 0;
}