#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define MD (1000000007U)
struct Modint{
unsigned val;
Modint(){
val=0;
}
Modint(int a){
val = ord(a);
}
Modint(unsigned a){
val = ord(a);
}
Modint(long long a){
val = ord(a);
}
Modint(unsigned long long a){
val = ord(a);
}
inline unsigned ord(unsigned a){
return a%MD;
}
inline unsigned ord(int a){
a %= (int)MD;
if(a < 0){
a += MD;
}
return a;
}
inline unsigned ord(unsigned long long a){
return a%MD;
}
inline unsigned ord(long long a){
a %= (int)MD;
if(a < 0){
a += MD;
}
return a;
}
inline unsigned get(){
return val;
}
inline Modint &operator+=(Modint a){
val += a.val;
if(val >= MD){
val -= MD;
}
return *this;
}
inline Modint &operator-=(Modint a){
if(val < a.val){
val = val + MD - a.val;
}
else{
val -= a.val;
}
return *this;
}
inline Modint &operator*=(Modint a){
val = ((unsigned long long)val*a.val)%MD;
return *this;
}
inline Modint &operator/=(Modint a){
return *this *= a.inverse();
}
inline Modint operator+(Modint a){
return Modint(*this)+=a;
}
inline Modint operator-(Modint a){
return Modint(*this)-=a;
}
inline Modint operator*(Modint a){
return Modint(*this)*=a;
}
inline Modint operator/(Modint a){
return Modint(*this)/=a;
}
inline Modint operator+(int a){
return Modint(*this)+=Modint(a);
}
inline Modint operator-(int a){
return Modint(*this)-=Modint(a);
}
inline Modint operator*(int a){
return Modint(*this)*=Modint(a);
}
inline Modint operator/(int a){
return Modint(*this)/=Modint(a);
}
inline Modint operator+(long long a){
return Modint(*this)+=Modint(a);
}
inline Modint operator-(long long a){
return Modint(*this)-=Modint(a);
}
inline Modint operator*(long long a){
return Modint(*this)*=Modint(a);
}
inline Modint operator/(long long a){
return Modint(*this)/=Modint(a);
}
inline Modint operator-(void){
Modint res;
if(val){
res.val=MD-val;
}
else{
res.val=0;
}
return res;
}
inline operator bool(void){
return val!=0;
}
inline operator int(void){
return get();
}
inline operator long long(void){
return get();
}
inline Modint inverse(){
int a = val;
int b = MD;
int u = 1;
int v = 0;
int t;
Modint res;
while(b){
t = a / b;
a -= t * b;
swap(a, b);
u -= t * v;
swap(u, v);
}
if(u < 0){
u += MD;
}
res.val = u;
return res;
}
inline Modint pw(unsigned long long b){
Modint a(*this);
Modint res;
res.val = 1;
while(b){
if(b&1){
res *= a;
}
b >>= 1;
a *= a;
}
return res;
}
inline bool operator==(int a){
return ord(a)==val;
}
inline bool operator!=(int a){
return ord(a)!=val;
}
}
;
inline Modint operator+(int a, Modint b){
return Modint(a)+=b;
}
inline Modint operator-(int a, Modint b){
return Modint(a)-=b;
}
inline Modint operator*(int a, Modint b){
return Modint(a)*=b;
}
inline Modint operator/(int a, Modint b){
return Modint(a)/=b;
}
inline Modint operator+(long long a, Modint b){
return Modint(a)+=b;
}
inline Modint operator-(long long a, Modint b){
return Modint(a)-=b;
}
inline Modint operator*(long long a, Modint b){
return Modint(a)*=b;
}
inline Modint operator/(long long a, Modint b){
return Modint(a)/=b;
}
#define main dummy_main
int main(){
return 0;
}
#undef main
Modint cnt[1001][26];
Modint dp[1001];
Modint nx[1001];
class Solution{
public:
int numWays(vector<string>& S, string T){
int i, k;
int N = S.size();
int M = S[0].size();
Modint s;
for(i=(0);i<(N);i++){
int j;
for(j=(0);j<(M);j++){
S[i][j] -= 'a';
}
}
for(i=(0);i<(T.size());i++){
T[i] -= 'a';
}
for(i=(0);i<(M);i++){
int j;
for(j=(0);j<(26);j++){
cnt[i][j] = 0;
}
}
for(i=(0);i<(N);i++){
int j;
for(j=(0);j<(M);j++){
cnt[j][S[i][j]] += 1;
}
}
for(i=(0);i<(M+1);i++){
dp[i] = 0;
}
dp[0] = 1;
for(k=(0);k<(T.size());k++){
{
auto jZyWAPpY = (0);
auto jbtyPBGc = ( dp[0]);
dp[0] = jZyWAPpY;
s = jbtyPBGc;
}
for(i=(0);i<(M);i++){
{
auto AlM5nNnR = (s * cnt[i][T[k]]);
auto XJIcIBrW = ( s + dp[i+1]);
dp[i+1] = AlM5nNnR;
s = XJIcIBrW;
}
}
}
{
int jPV_0s1p;
Modint BUotOFBp;
if(M+1==0){
BUotOFBp = 0;
}
else{
BUotOFBp = dp[0];
for(jPV_0s1p=(1);jPV_0s1p<(M+1);jPV_0s1p++){
BUotOFBp += dp[jPV_0s1p];
}
}
return BUotOFBp;
}
}
}
;
// cLay varsion 20201031-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// Modint cnt[1001][26];
// Modint dp[1001], nx[1001];
//
// class Solution {
// public:
// int numWays(vector<string>& S, string T) {
// int N = S.size(), M = S[0].size();
// Modint s;
//
// rep(i,N) rep(j,M) S[i][j] -= 'a';
// rep(i,T.size()) T[i] -= 'a';
//
// rep(i,M) rep(j,26) cnt[i][j] = 0;
// rep(i,N) rep(j,M) cnt[j][S[i][j]] += 1;
//
// rep(i,M+1) dp[i] = 0;
// dp[0] = 1;
//
// rep(k,T.size()){
// (dp[0], s) = (0, dp[0]);
// rep(i,M) (dp[i+1], s) = (s * cnt[i][T[k]], s + dp[i+1]);
// }
// return sum(dp(M+1));
// }
// };