#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define MD (1000000007U)
void *wmem;
char memarr[96000000];
template<class T> void malloc1d(T **arr, int x){
(*arr) = (T*)malloc(x*sizeof(T));
}
template<class T> void free1d(T *arr){
free(arr);
}
template<class T> void malloc2d(T ***arr, int x, int y){
int i;
(*arr) = (T**)malloc(x*sizeof(T*));
(*arr)[0] = (T*)malloc(x*y*sizeof(T));
int qSsg05KM = x;
for(i=(1);i<(qSsg05KM);i++){
(*arr)[i]=(*arr)[i-1]+y;
}
}
template<class T> void free2d(T **arr){
free(arr[0]);
free(arr);
}
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;
}
template<class S> struct AhoCorasick_Sum{
int node;
int mem;
int alphabet;
int **nx;
int *failed;
S *sum;
void init(void){
int i;
node = 1;
for(i=(0);i<(alphabet);i++){
nx[0][i] = -1;
}
failed[0] = 0;
sum[0] = 0;
}
void malloc(const int n, const int k){
int i;
malloc2d(&nx,n,k);
malloc1d(&failed,n);
malloc1d(&sum,n);
node = n;
alphabet = k;
init();
}
void free(void){
free2d(nx);
free1d(failed);
free1d(sum);
}
template<class T> void addWord(const T word[], const int len, S val){
int i;
int j;
int k;
int now = 0;
for(i=(0);i<(len);i++){
if(nx[now][word[i]]==-1){
k = node++;
nx[now][word[i]] = k;
for(j=(0);j<(alphabet);j++){
nx[k][j] = -1;
}
sum[k] = 0;
}
now = nx[now][word[i]];
}
sum[now] += val;
}
void construct(void *mem = wmem){
int i;
int j;
int k;
int now;
int *q;
int qs;
int qe;
q = (int*) mem;
qs = qe = 0;
now = 0;
for(k=(0);k<(alphabet);k++){
if(nx[now][k] != -1){
q[qe++] = nx[now][k];
failed[ nx[now][k] ] = now;
}
}
while(qs < qe){
now = q[qs++];
for(k=(0);k<(alphabet);k++){
if(nx[now][k] != -1){
i = failed[now];
while(i){
if(nx[i][k] != -1){
break;
}
i = failed[i];
}
if(nx[i][k] != -1){
i = nx[i][k];
}
failed[ nx[now][k] ] = i;
sum[ nx[now][k] ] += sum[i];
q[qe++] = nx[now][k];
}
}
}
}
template<class T> inline int next(const int n, const T c){
int i;
int now;
now = n;
if(nx[n][c]!=-1){
return nx[n][c];
}
while(now && nx[now][c]==-1){
now=failed[now];
}
if(nx[now][c]!=-1){
now = nx[now][c];
}
return nx[n][c] = now;
}
}
;
#define main dummy_main
int main(){
wmem = memarr;
return 0;
}
#undef main
Modint dp[501][2][2][51];
class Solution{
public:
int findGoodStrings(int n, string s1, string s2, string evil){
int i, x;
dummy_main();
int m = evil.size();
int e[51];
int st;
int ed;
int sx;
int sy;
int sj;
Modint res = 0;
AhoCorasick_Sum<int> aho;
for(i=(0);i<(n);i++){
{
auto Q5VJL1cS = ('a');
s1[i] -= Q5VJL1cS;
s2[i] -= Q5VJL1cS;
}
}
for(i=(0);i<(m);i++){
e[i] = evil[i] - 'a';
}
aho.malloc(m+1, 26);
aho.init();
aho.addWord(e, m, 1);
aho.construct();
m = aho.node;
for(i=(0);i<(n+1);i++){
int x;
for(x=(0);x<(2);x++){
int y;
for(y=(0);y<(2);y++){
int j;
for(j=(0);j<(m);j++){
dp[i][x][y][j] = 0;
}
}
}
}
dp[0][0][0][0] = 1;
for(i=(0);i<(n);i++){
int x;
for(x=(0);x<(2);x++){
int y;
for(y=(0);y<(2);y++){
int j;
for(j=(0);j<(m);j++){
int k;
if(x){
st =0;
}
else{
st =s1[i];
}
if(y){
ed =25;
}
else{
ed =s2[i];
}
for(k=(st);k<(ed+1);k++){
sj = aho.next(j, k);
if(aho.sum[sj]){
continue;
}
if(k > s1[i]){
sx =1;
}
else{
sx =x;
}
if(k < s2[i]){
sy =1;
}
else{
sy =y;
}
dp[i+1][sx][sy][sj] += dp[i][x][y][j];
}
}
}
}
}
for(x=(0);x<(2);x++){
int y;
for(y=(0);y<(2);y++){
int j;
for(j=(0);j<(m);j++){
res += dp[n][x][y][j];
}
}
}
aho.free();
return res;
}
}
;
// cLay varsion 20200325-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// Modint dp[501][2][2][51];
//
// class Solution {
// public:
// int findGoodStrings(int n, string s1, string s2, string evil) {
// dummy_main();
//
// int m = evil.size(), e[51];
// int st, ed, sx, sy, sj;
// Modint res = 0;
//
// AhoCorasick_Sum<int> aho;
// rep(i,n) (s1[i], s2[i]) -= 'a';
// rep(i,m) e[i] = evil[i] - 'a';
// aho.malloc(m+1, 26);
// aho.init();
// aho.addWord(e, m, 1);
// aho.construct();
// m = aho.node;
//
// rep(i,n+1) rep(x,2) rep(y,2) rep(j,m) dp[i][x][y][j] = 0;
// dp[0][0][0][0] = 1;
//
// rep(i,n) rep(x,2) rep(y,2) rep(j,m){
// st = if[x,0,s1[i]];
// ed = if[y,25,s2[i]];
// rep(k,st,ed+1){
// sj = aho.next(j, k);
// if(aho.sum[sj]) continue;
// sx = if[k > s1[i], 1, x];
// sy = if[k < s2[i], 1, y];
// dp[i+1][sx][sy][sj] += dp[i][x][y][j];
// }
// }
// rep(x,2) rep(y,2) rep(j,m) res += dp[n][x][y][j];
//
// aho.free();
// return res;
// }
// };