constint maxn = 5e4+5; constint MOD = 1e9+7; int f[1<<10][maxn][2]; int ans; int n,m; int a[15][maxn]; int bas; int c[maxn]; int idx; int ls[maxn],rs[maxn]; int val[maxn],sta[maxn]; int op[maxn],top,tp,rt; string s; pair<int,int> u[15];
voidcheck(){ while (~op[top]) { val[++idx] = -op[top--]; ls[idx] = sta[tp-1]; rs[idx] = sta[tp], sta[--tp] = idx; } } voidDFS(int x){ if (val[x]>=0) { for (int S=0;S<=bas;S++) { if ((S>>val[x])&1) f[S][x][0] = 1; else f[S][x][1] = 1; } return; } DFS(ls[x]); DFS(rs[x]); for(int S=0;S<=bas;S++) { if (-1==val[x]) { f[S][x][1] = 1ll*f[S][ls[x]][1]*f[S][rs[x]][1]%MOD, f[S][x][0] = (1ll*(f[S][ls[x]][0]+f[S][ls[x]][1])*(f[S][rs[x]][0]+f[S][rs[x]][1])-f[S][x][1])%MOD; } elseif (-2==val[x]) { f[S][x][0] = 1ll*f[S][ls[x]][0]*f[S][rs[x]][0]%MOD, f[S][x][1] = ((1ll*f[S][ls[x]][0]+1ll*f[S][ls[x]][1])*(f[S][rs[x]][0]+f[S][rs[x]][1])-f[S][x][0])%MOD; } else { f[S][x][0] = (1ll*f[S][ls[x]][0]*f[S][rs[x]][0]*2+1ll*f[S][ls[x]][0]*f[S][rs[x]][1]+1ll*f[S][ls[x]][1]*f[S][rs[x]][0])%MOD, f[S][x][1] = (1ll*f[S][ls[x]][1]*f[S][rs[x]][1]*2+1ll*f[S][ls[x]][0]*f[S][rs[x]][1]+1ll*f[S][ls[x]][1]*f[S][rs[x]][0])%MOD; } } } voidcalc(int x){ for (int i=0;i<m;i++) u[i] = make_pair(a[i][x],i); sort(u,u+m); int S=0; for (int i=0;i<m;i++) { ans += 1ll*(f[S][rt][1]-f[S+(1<<u[i].second)][rt][1])*u[i].first%MOD; S |= 1<<u[i].second; ans %= MOD; } } intmain(){ cin>>n>>m; bas = (1<<m)-1; op[0] = ~0; for(int i=0;i<m;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; cin>>s; int len = s.size(); s = "#"+s; for(int i=1;i<=len;i++) { if (s[i]=='(') op[++top] = -1; elseif (s[i]=='<') op[++top] = 1; elseif (s[i]=='>') op[++top] = 2; elseif (s[i]=='?') op[++top] = 3; elseif (s[i]==')') top--,check(); else { val[sta[++tp]=++idx] = s[i]-'0'; check(); } } rt = sta[tp]; DFS(rt); for (int i=1;i<=n;i++) calc(i); ans = (ans%MOD+MOD)%MOD; cout<<ans<<endl; }