func_code_string: #include<bits/stdc++.h>   using namespace std;   int read() {    char c=getchar(); int x=0,f=1;    while (c< 0  || c> 9 ) {     if (c== - ) f=-1;     c=getchar();    }    while (c>= 0  && c<= 9 ) {     x=x*10+c- 0 ;     c=getchar();    }    return x*f;   }   const int p=998244353;   int a[1200005],b[1200005],c[1200005],fac[1200005],inv[1200005];    int pow_3[1200005],inv_3[1200005],R[1200005];   void add(int &x,int y) {x+=y; if (x>=p) x-=p;}   int pow_mod(int x,int k) {    int ans=1;    while (k) {     if (k&1) ans=1LL*ans*x%p;     x=1LL*x*x%p;     k>>=1;     }    return ans;   }   void ntt(int *x,int n,int f) {       pow_3[1]=pow_mod(3,(p-1)/n);       if (f==1) {           pow_3[0]=1;            for (int i=1; i<n; i++) pow_3[i]=1LL*pow_3[i-1]*pow_3[1]%p;       }       else {           inv_3[0]=1; inv_3[1]=pow_mod(pow_3[1],p-2);           for (int i=2; i<n; i++) inv_3[i]=1LL*inv_3[i-1]*inv_3[1]%p;       }       int t=0,tp=1;       while (tp<n) tp<<=1,++t;       for (int i=0; i<tp; i++) R[i]=(R[i>>1]>>1)|((i&1)?(tp>>1):0);       for (int i=0; i<n; i++) if (i<R[i]) swap(x[i],x[R[i]]);       for (int l=2; l<=n; l<<=1) {           int m=l/2;           for (int *y=x; y!=x+n; y+=l) {               for (int j=0; j<m; j++) {                   int tmp;                   if (f==1) tmp=1LL*y[j+m]*pow_3[n/l*j]%p;                   else tmp=1LL*y[j+m]*inv_3[n/l*j]%p;                   y[j+m]=y[j]-tmp; if (y[j+m]<0) y[j+m]+=p;                    y[j]+=tmp; if (y[j]>=p) y[j]-=p;               }           }       }       if (f==-1) {           int tmp=pow_mod(n,p-2);           for (int i=0; i<n; i++) x[i]=1LL*x[i]*tmp%p;       }   }   int f[300005],tot;   vector<int> vec[300005];   char s[300005];   int calc(int x) {    return 1LL*f[x+1]*pow_mod(2,tot-x)%p;   }   int main() {    for (int i=0; i<=300001; i++) a[i]=i/2;    for (int i=0; i<=300001; i++) b[i]=pow_mod(2,i);    int N=1;       while (N<=600000) N<<=1;    ntt(a,N,1); ntt(b,N,1);    for (int i=0; i<N; i++) c[i]=1LL*a[i]*b[i]%p;    ntt(c,N,-1);    f[0]=0;    int sum=0;    for (int i=1; i<=300001; i++) {     f[i]=(i-1)/2;     add(f[i],sum);     if (i>=2) add(f[i],c[i-2]);     add(sum,f[i]);    }    int n=read(),m=read(); tot=0;    for (int i=0; i<n; i++) {     scanf( %s , s);     for (int j=0; j<m; j++) {      vec[i].push_back((s[j]== o )?1:-1);      if (s[j]== o ) ++tot;     }    }    int ans=0;    for (int i=0; i<n; i++) {     int cnt=0;     for (int j=0; j<m; j++) {      if (vec[i][j]==1) ++cnt;      else {       if (cnt>0) add(ans,calc(cnt));       cnt=0;      }     }     if (cnt>0) add(ans,calc(cnt));    }    for (int j=0; j<m; j++) {     int cnt=0;     for (int i=0; i<n; i++) {      if (vec[i][j]==1) ++cnt;      else {       if (cnt>0) add(ans,calc(cnt));       cnt=0;      }     }     if (cnt>0) add(ans,calc(cnt));    }    printf( %d n , ans);    return 0;   }   