#include <bits/stdc++.h>
using namespace std;
//
const int mx = 1e5 + 5;
const int base = 331;
const int mod = 1e9 + 7;
const int mod1 = 1e9 + 2277;
const int mod2 = 1e9 + 5277;
//
int n;
int dp[mx] = {1};
vector<int> len;
unordered_set<int> S1[mx], S2[mx];
long long h1[mx], p1[mx] = {1};
long long h2[mx], p2[mx] = {1};
string T;
//
int hashing1 (void)
{
long long hash_value = 0;
//
for (char c : T)
hash_value = (hash_value * base + c) % mod1;
return hash_value;
}
int hashing2 (void)
{
long long hash_value = 0;
//
for (char c : T)
hash_value = (hash_value * base + c) % mod2;
return hash_value;
}
int get1 (int l, int r)
{
return (h1[r] - h1[l] * p1[r - l] + 1LL * mod1 * mod1) % mod1;
}
int get2 (int l, int r)
{
return (h2[r] - h2[l] * p2[r - l] + 1LL * mod2 * mod2) % mod2;
}
inline void add (int &a, int b)
{
a += b;
if (a >= mod)
a -= mod;
}
//
void process (void)
{
for (cin >> n; n--;)
{
cin >> T;
S1[T.size()].insert(hashing1());
S2[T.size()].insert(hashing2());
}
cin >> T;
n = T.size();
for (int i = 1; i <= n; ++i)
{
p1[i] = p1[i - 1] * base % mod1;
h1[i] = (h1[i - 1] * base + T[i - 1]) % mod1;
p2[i] = p2[i - 1] * base % mod2;
h2[i] = (h2[i - 1] * base + T[i - 1]) % mod2;
}
for (int i = 1; i <= n; ++i)
if (!S1[i].empty())
len.emplace_back(i);
for (int i = 1; i <= n; ++i)
for (int j : len)
{
if (j > i)
break;
if (S1[j].find(get1(i - j, i)) != S1[j].end() &&
S2[j].find(get2(i - j, i)) != S2[j].end())
add(dp[i], dp[i - j]);
}
cout << dp[n];
}
//
signed main (void)
{
ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
process();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8vCmNvbnN0IGludCBteCA9IDFlNSArIDU7CmNvbnN0IGludCBiYXNlID0gMzMxOwpjb25zdCBpbnQgbW9kID0gMWU5ICsgNzsKY29uc3QgaW50IG1vZDEgPSAxZTkgKyAyMjc3Owpjb25zdCBpbnQgbW9kMiA9IDFlOSArIDUyNzc7Ci8vCmludCBuOwppbnQgZHBbbXhdID0gezF9Owp2ZWN0b3I8aW50PiBsZW47CnVub3JkZXJlZF9zZXQ8aW50PiBTMVtteF0sIFMyW214XTsKbG9uZyBsb25nIGgxW214XSwgcDFbbXhdID0gezF9Owpsb25nIGxvbmcgaDJbbXhdLCBwMltteF0gPSB7MX07CnN0cmluZyBUOwovLwppbnQgaGFzaGluZzEgKHZvaWQpCnsKICAgIGxvbmcgbG9uZyBoYXNoX3ZhbHVlID0gMDsKICAgIC8vCiAgICBmb3IgKGNoYXIgYyA6IFQpCiAgICAgICAgaGFzaF92YWx1ZSA9IChoYXNoX3ZhbHVlICogYmFzZSArIGMpICUgbW9kMTsKICAgIHJldHVybiBoYXNoX3ZhbHVlOwp9CmludCBoYXNoaW5nMiAodm9pZCkKewogICAgbG9uZyBsb25nIGhhc2hfdmFsdWUgPSAwOwogICAgLy8KICAgIGZvciAoY2hhciBjIDogVCkKICAgICAgICBoYXNoX3ZhbHVlID0gKGhhc2hfdmFsdWUgKiBiYXNlICsgYykgJSBtb2QyOwogICAgcmV0dXJuIGhhc2hfdmFsdWU7Cn0KaW50IGdldDEgKGludCBsLCBpbnQgcikKewogICAgcmV0dXJuIChoMVtyXSAtIGgxW2xdICogcDFbciAtIGxdICsgMUxMICogbW9kMSAqIG1vZDEpICUgbW9kMTsKfQppbnQgZ2V0MiAoaW50IGwsIGludCByKQp7CiAgICByZXR1cm4gKGgyW3JdIC0gaDJbbF0gKiBwMltyIC0gbF0gKyAxTEwgKiBtb2QyICogbW9kMikgJSBtb2QyOwp9CmlubGluZSB2b2lkIGFkZCAoaW50ICZhLCBpbnQgYikKewogICAgYSArPSBiOwogICAgaWYgKGEgPj0gbW9kKQogICAgICAgIGEgLT0gbW9kOwp9Ci8vCnZvaWQgcHJvY2VzcyAodm9pZCkKewogICAgZm9yIChjaW4gPj4gbjsgbi0tOykKICAgIHsKICAgICAgICBjaW4gPj4gVDsKICAgICAgICBTMVtULnNpemUoKV0uaW5zZXJ0KGhhc2hpbmcxKCkpOwogICAgICAgIFMyW1Quc2l6ZSgpXS5pbnNlcnQoaGFzaGluZzIoKSk7CiAgICB9CiAgICBjaW4gPj4gVDsKICAgIG4gPSBULnNpemUoKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkKICAgIHsKICAgICAgICBwMVtpXSA9IHAxW2kgLSAxXSAqIGJhc2UgJSBtb2QxOwogICAgICAgIGgxW2ldID0gKGgxW2kgLSAxXSAqIGJhc2UgKyBUW2kgLSAxXSkgJSBtb2QxOwogICAgICAgIHAyW2ldID0gcDJbaSAtIDFdICogYmFzZSAlIG1vZDI7CiAgICAgICAgaDJbaV0gPSAoaDJbaSAtIDFdICogYmFzZSArIFRbaSAtIDFdKSAlIG1vZDI7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKQogICAgICAgIGlmICghUzFbaV0uZW1wdHkoKSkKICAgICAgICAgICAgbGVuLmVtcGxhY2VfYmFjayhpKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkKICAgICAgICBmb3IgKGludCBqIDogbGVuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGogPiBpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChTMVtqXS5maW5kKGdldDEoaSAtIGosIGkpKSAhPSBTMVtqXS5lbmQoKSAmJgogICAgICAgICAgICAgICAgUzJbal0uZmluZChnZXQyKGkgLSBqLCBpKSkgIT0gUzJbal0uZW5kKCkpCiAgICAgICAgICAgICAgICBhZGQoZHBbaV0sIGRwW2kgLSBqXSk7CiAgICAgICAgfQoKICAgIGNvdXQgPDwgZHBbbl07Cn0KLy8Kc2lnbmVkIG1haW4gKHZvaWQpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpLCBjaW4udGllKG51bGxwdHIpLCBjb3V0LnRpZShudWxscHRyKTsKICAgIHByb2Nlc3MoKTsKfQ==