#include<cstdio>#include<bitset>usingnamespace std;#define maxn 205#define mod 998244353int n, cnt, ans =1;int A[maxn][maxn], B[maxn][maxn];
bitset < maxn > lib[maxn], t;intqkpow(int x,int y ){int res =1;while( y ){if( y &1) res =1ll* res * x % mod;x =1ll* x * x % mod;y >>=1;}return res;}intmain(){scanf("%d",&n );for(int i =1;i <= n;i ++)for(int j =1;j <= n;j ++)scanf("%d",&A[i][j]);for(int i =1;i <= n;i ++)for(int j =1;j <= n;j ++)scanf("%d",&B[i][j]);for(int j =1;j <= n;j ++){for(int i =1;i <= n;i ++)lib[i].reset();cnt =0;for(int i =1;i <= n;i ++){t.reset();for(int k =1;k <= n;k ++)if( A[i][k]) t.flip( k );if( B[i][j]) t.flip( i );for(int k =1;k <= n;k ++)if( t[k]){if( lib[k].any()) t ^= lib[k];else{lib[k]= t;cnt++;break;}}}ans += n - cnt;}ans =qkpow(2, ans );printf("%lld\n", ans );return0;}
#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usingnamespace std;#define maxn 100005struct node {int n, m;int x[maxn], id[maxn], rnk[maxn <<1], h[maxn], sa[maxn], tot[maxn];int st[maxn][20];voidsuffix(int N,int*s ){n = N, m = N +1;for(int i =1;i <= n;i ++) tot[x[i]= s[i]]++;for(int i =1;i <= m;i ++) tot[i]+= tot[i -1];for(int i = n;i;i --) sa[tot[x[i]]--]= i;for(int k =1;k <= n;k <<=1){int num =0;for(int i = n - k +1;i <= n;i ++) id[++ num]= i;for(int i =1;i <= n;i ++)if( sa[i]> k ) id[++ num]= sa[i]- k;memset( tot,0,sizeof( tot ));for(int i =1;i <= n;i ++) tot[x[i]]++;for(int i =1;i <= m;i ++) tot[i]+= tot[i -1];for(int i = n;i;i --) sa[tot[x[id[i]]]--]= id[i];for(int i =1;i <= n;i ++) rnk[i]= x[i];x[sa[1]]= num =1;for(int i =2;i <= n;i ++)x[sa[i]]=( rnk[sa[i]]== rnk[sa[i -1]]&& rnk[sa[i]+ k]== rnk[sa[i -1]+ k])? num :++ num;if( n == num )break;m = num;}for(int i =1;i <= n;i ++) rnk[sa[i]]= i;int k =0;for(int i =1;i <= n;i ++){if( rnk[i]==1)continue;if( k ) k --;int j = sa[rnk[i]-1];while( i + k <= n && j + k <= n && s[i + k]== s[j + k]) k ++;h[rnk[i]]= k;}for(int i =1;i <= n;i ++) st[i][0]= h[i];for(int j =1;j <20;j ++)for(int i =1;i <= n;i ++)if( i +(1<< j -1)> n )break;else st[i][j]=min( st[i][j -1], st[i +(1<< j -1)][j -1]);}intlcp(int l,int r ){if( l <=0|| r <=0|| l > n || r > n )return0;if( l == r )return n - l +1;l = rnk[l], r = rnk[r];if( l > r )swap( l, r );l ++;int i =log( r - l +1)/log(2);returnmin( st[l][i], st[r -(1<< i )+1][i]);}}SA;int n;char s[maxn];int last[maxn], idx[maxn], t[maxn];int nxt[maxn][30];intLCP(int x,int y ){int sx = x, sy = y;x --, y --;int len =0;for(int i =0;i <26&& x +1<= n && y +1<= n;i ++){int l = SA.lcp( x +1, y +1);if( x + l +1< nxt[sx][i]&& y + l +1< nxt[sy][i])return len + l;if( nxt[sx][i]- sx == nxt[sy][i]- sy ){//如果一段都是相同 就一段段的跳len += nxt[sx][i]- x;x = nxt[sx][i], y = nxt[sy][i];}else{if( nxt[sx][i]- sx < nxt[sy][i]- sy )return len + nxt[sx][i]- x -1;elsereturn len + nxt[sy][i]- y -1;}}return len;}boolcmp(int x,int y ){int len =LCP( x, y );if( x + len > n || y + len > n )return x + len > n;int vx = t[x + len], vy = t[y + len];for(int i =0;i <26;i ++)if( nxt[x][i]== x + len ){ vx =0;break;}for(int i =0;i <26;i ++)if( nxt[y][i]== y + len ){ vy =0;break;}return vx < vy;}intmain(){scanf("%d %s",&n, s +1);for(int i =1;i <= n;i ++){int j = s[i]-'a';if(! last[j]) t[i]= n +1;else t[i]= i - last[j];last[j]= i, idx[i]= i;}SA.suffix( n, t );for(int i =0;i <26;i ++) nxt[n +1][i]= n +2;for(int i = n;i;i --){for(int j =0;j <26;j ++)nxt[i][j]= nxt[i +1][j];nxt[i][s[i]-'a']= i;}for(int i =1;i <= n;i ++)sort( nxt[i], nxt[i]+26);sort( idx +1, idx + n +1, cmp );longlong ans =1ll* n *( n +1)/2;for(int i =1;i < n;i ++)ans -=LCP( idx[i], idx[i +1]);printf("%lld\n", ans );return0;}