// ﷽
// Contest: string (medium)
//
// Judge: Codeforces
// URL: https://c...content-available-to-author-only...s.com/group/o09Gu2FpOx/contest/559867/problem/C
// Memory Limit: 512
// Time Limit: 10000
// Start: Thu 08 May 2025 12:25:56 AM EEST
#include <bits/stdc++.h>
#ifdef ALGOAT
#include "debug.hpp"
#else
#define debug(...) 0
#define debug_itr(...) 0
#define debug_bits(...) 0
#endif
// 48-57 -> 0-9 65-90 -> A-Z 97-122 -> a-z
#define fastio() \
ios_base::sync_with_stdio(false); \
cin.tie(NULL);
#define int long long
#define F first
#define S second
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define rep(i, a, b) for (int i = (a); i < (b); ++i)
#define sz(x) (int)(x).size()
#define vi vector<int>
/*template <class T> using rpq = priority_queue<T, vector<T>, greater<T>>;*/
const int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1},
dy[8] = {0, 1, 0, -1, -1, 1, -1, 1};
using namespace std;
struct AhoCorasick {
enum { alpha = 26, first = 'a' }; // change this!
struct Node {
// (nmatches is optional)
int back, next[alpha], start = -1, end = -1, nmatches = 0;
Node(int v) { memset(next, v, sizeof(next)); }
};
vector<Node> N;
vi backp;
void insert(string &s, int j) {
assert(!s.empty());
int n = 0;
for (char c : s) {
int &m = N[n].next[c - first];
if (m == -1) {
n = m = sz(N);
N.emplace_back(-1);
} else
n = m;
}
if (N[n].end == -1)
N[n].start = j;
backp.push_back(N[n].end);
N[n].end = j;
N[n].nmatches++;
}
AhoCorasick(vector<string> &pat) : N(1, -1) {
rep(i, 0, sz(pat)) insert(pat[i], i);
N[0].back = sz(N);
N.emplace_back(0);
queue<int> q;
for (q.push(0); !q.empty(); q.pop()) {
int n = q.front(), prev = N[n].back;
rep(i, 0, alpha) {
int &ed = N[n].next[i], y = N[prev].next[i];
if (ed == -1)
ed = y;
else {
N[ed].back = y;
(N[ed].end == -1 ? N[ed].end : backp[N[ed].start]) = N[y].end;
N[ed].nmatches += N[y].nmatches;
q.push(ed);
}
}
}
}
vi find(string word) {
int n = 0;
vi res; // int count = 0;
for (char c : word) {
n = N[n].next[c - first];
res.push_back(N[n].end);
// count += N[n].nmatches;
}
return res;
}
vector<vi> findAll(vector<string> &pat, string word) {
vi r = find(word);
vector<vi> res(sz(word));
rep(i, 0, sz(word)) {
int ind = r[i];
while (ind != -1) {
res[i - sz(pat[ind]) + 1].push_back(ind);
ind = backp[ind];
}
}
return res;
}
};
void solve() {
int n;
cin >> n;
vector<string> dict(n);
for (auto &x : dict)
cin >> x;
string s;
cin >> s;
int m = s.size();
AhoCorasick ac(dict);
const int INF = INT_MAX / 2;
vector<int> dp(m + 1, INF);
dp[0] = 0;
int node = 0;
const int MOD = 1e9 + 7;
for (int i = 0; i < m; ++i) {
node = ac.N[node].next[s[i] - 'a'];
for (int out = ac.N[node].end; out != -1; out = ac.backp[out]) {
int len = dict[out].size();
dp[i + 1] = min(dp[i + 1] , dp[i + 1 - len]+1 );
}
}
cout << (dp[m] >= INF ? -1 : dp[m]) << "\n";
}
int32_t main() {
/*freopen("whereami.in", "r", stdin);*/
/*freopen("whereami.out", "w", stdout);*/
fastio();
int n = 1;
#ifdef MUTLI_CASE
cin >> n;
#endif
while (n--)
solve();
return 0;
}
Ly8g77e9Ci8vIENvbnRlc3Q6IHN0cmluZyAobWVkaXVtKQovLwovLyBKdWRnZTogQ29kZWZvcmNlcwovLyBVUkw6IGh0dHBzOi8vYy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ucy5jb20vZ3JvdXAvbzA5R3UyRnBPeC9jb250ZXN0LzU1OTg2Ny9wcm9ibGVtL0MKLy8gTWVtb3J5IExpbWl0OiA1MTIKLy8gVGltZSBMaW1pdDogMTAwMDAKLy8gU3RhcnQ6IFRodSAwOCBNYXkgMjAyNSAxMjoyNTo1NiBBTSBFRVNUCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgoKI2lmZGVmIEFMR09BVAojaW5jbHVkZSAiZGVidWcuaHBwIgojZWxzZQojZGVmaW5lIGRlYnVnKC4uLikgMAojZGVmaW5lIGRlYnVnX2l0ciguLi4pIDAKI2RlZmluZSBkZWJ1Z19iaXRzKC4uLikgMAojZW5kaWYKCi8vIDQ4LTU3IC0+IDAtOSAgNjUtOTAgLT4gQS1aIDk3LTEyMiAtPiBhLXoKI2RlZmluZSBmYXN0aW8oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBjaW4udGllKE5VTEwpOwoKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgRiBmaXJzdAojZGVmaW5lIFMgc2Vjb25kCiNkZWZpbmUgYWxsKGEpIChhKS5iZWdpbigpLCAoYSkuZW5kKCkKI2RlZmluZSByYWxsKGEpIChhKS5yYmVnaW4oKSwgKGEpLnJlbmQoKQojZGVmaW5lIHJlcChpLCBhLCBiKSBmb3IgKGludCBpID0gKGEpOyBpIDwgKGIpOyArK2kpCiNkZWZpbmUgc3ooeCkgKGludCkoeCkuc2l6ZSgpCiNkZWZpbmUgdmkgdmVjdG9yPGludD4KCi8qdGVtcGxhdGUgPGNsYXNzIFQ+IHVzaW5nIHJwcSA9IHByaW9yaXR5X3F1ZXVlPFQsIHZlY3RvcjxUPiwgZ3JlYXRlcjxUPj47Ki8KCmNvbnN0IGludCBkeFs4XSA9IHsxLCAwLCAtMSwgMCwgMSwgMSwgLTEsIC0xfSwKICAgICAgICAgIGR5WzhdID0gezAsIDEsIDAsIC0xLCAtMSwgMSwgLTEsIDF9OwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBBaG9Db3Jhc2ljayB7CiAgZW51bSB7IGFscGhhID0gMjYsIGZpcnN0ID0gJ2EnIH07IC8vIGNoYW5nZSB0aGlzIQogIHN0cnVjdCBOb2RlIHsKICAgIC8vIChubWF0Y2hlcyBpcyBvcHRpb25hbCkKICAgIGludCBiYWNrLCBuZXh0W2FscGhhXSwgc3RhcnQgPSAtMSwgZW5kID0gLTEsIG5tYXRjaGVzID0gMDsKICAgIE5vZGUoaW50IHYpIHsgbWVtc2V0KG5leHQsIHYsIHNpemVvZihuZXh0KSk7IH0KICB9OwogIHZlY3RvcjxOb2RlPiBOOwogIHZpIGJhY2twOwogIHZvaWQgaW5zZXJ0KHN0cmluZyAmcywgaW50IGopIHsKICAgIGFzc2VydCghcy5lbXB0eSgpKTsKICAgIGludCBuID0gMDsKICAgIGZvciAoY2hhciBjIDogcykgewogICAgICBpbnQgJm0gPSBOW25dLm5leHRbYyAtIGZpcnN0XTsKICAgICAgaWYgKG0gPT0gLTEpIHsKICAgICAgICBuID0gbSA9IHN6KE4pOwogICAgICAgIE4uZW1wbGFjZV9iYWNrKC0xKTsKICAgICAgfSBlbHNlCiAgICAgICAgbiA9IG07CiAgICB9CiAgICBpZiAoTltuXS5lbmQgPT0gLTEpCiAgICAgIE5bbl0uc3RhcnQgPSBqOwogICAgYmFja3AucHVzaF9iYWNrKE5bbl0uZW5kKTsKICAgIE5bbl0uZW5kID0gajsKICAgIE5bbl0ubm1hdGNoZXMrKzsKICB9CiAgQWhvQ29yYXNpY2sodmVjdG9yPHN0cmluZz4gJnBhdCkgOiBOKDEsIC0xKSB7CiAgICByZXAoaSwgMCwgc3oocGF0KSkgaW5zZXJ0KHBhdFtpXSwgaSk7CiAgICBOWzBdLmJhY2sgPSBzeihOKTsKICAgIE4uZW1wbGFjZV9iYWNrKDApOwoKICAgIHF1ZXVlPGludD4gcTsKICAgIGZvciAocS5wdXNoKDApOyAhcS5lbXB0eSgpOyBxLnBvcCgpKSB7CiAgICAgIGludCBuID0gcS5mcm9udCgpLCBwcmV2ID0gTltuXS5iYWNrOwogICAgICByZXAoaSwgMCwgYWxwaGEpIHsKICAgICAgICBpbnQgJmVkID0gTltuXS5uZXh0W2ldLCB5ID0gTltwcmV2XS5uZXh0W2ldOwogICAgICAgIGlmIChlZCA9PSAtMSkKICAgICAgICAgIGVkID0geTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIE5bZWRdLmJhY2sgPSB5OwogICAgICAgICAgKE5bZWRdLmVuZCA9PSAtMSA/IE5bZWRdLmVuZCA6IGJhY2twW05bZWRdLnN0YXJ0XSkgPSBOW3ldLmVuZDsKICAgICAgICAgIE5bZWRdLm5tYXRjaGVzICs9IE5beV0ubm1hdGNoZXM7CiAgICAgICAgICBxLnB1c2goZWQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICB2aSBmaW5kKHN0cmluZyB3b3JkKSB7CiAgICBpbnQgbiA9IDA7CiAgICB2aSByZXM7IC8vIGludCBjb3VudCA9IDA7CiAgICBmb3IgKGNoYXIgYyA6IHdvcmQpIHsKICAgICAgbiA9IE5bbl0ubmV4dFtjIC0gZmlyc3RdOwogICAgICByZXMucHVzaF9iYWNrKE5bbl0uZW5kKTsKICAgICAgLy8gY291bnQgKz0gTltuXS5ubWF0Y2hlczsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfQogIHZlY3Rvcjx2aT4gZmluZEFsbCh2ZWN0b3I8c3RyaW5nPiAmcGF0LCBzdHJpbmcgd29yZCkgewogICAgdmkgciA9IGZpbmQod29yZCk7CiAgICB2ZWN0b3I8dmk+IHJlcyhzeih3b3JkKSk7CiAgICByZXAoaSwgMCwgc3ood29yZCkpIHsKICAgICAgaW50IGluZCA9IHJbaV07CiAgICAgIHdoaWxlIChpbmQgIT0gLTEpIHsKICAgICAgICByZXNbaSAtIHN6KHBhdFtpbmRdKSArIDFdLnB1c2hfYmFjayhpbmQpOwogICAgICAgIGluZCA9IGJhY2twW2luZF07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXM7CiAgfQp9OwoKdm9pZCBzb2x2ZSgpIHsKICBpbnQgbjsKICBjaW4gPj4gbjsKICB2ZWN0b3I8c3RyaW5nPiBkaWN0KG4pOwogIGZvciAoYXV0byAmeCA6IGRpY3QpCiAgICBjaW4gPj4geDsKICBzdHJpbmcgczsKICBjaW4gPj4gczsKICBpbnQgbSA9IHMuc2l6ZSgpOwoKICBBaG9Db3Jhc2ljayBhYyhkaWN0KTsKICBjb25zdCBpbnQgSU5GID0gSU5UX01BWCAvIDI7CiAgdmVjdG9yPGludD4gZHAobSArIDEsIElORik7CgogIGRwWzBdID0gMDsKCiAgaW50IG5vZGUgPSAwOwogIGNvbnN0IGludCBNT0QgPSAxZTkgKyA3OwogIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICBub2RlID0gYWMuTltub2RlXS5uZXh0W3NbaV0gLSAnYSddOwogICAgZm9yIChpbnQgb3V0ID0gYWMuTltub2RlXS5lbmQ7IG91dCAhPSAtMTsgb3V0ID0gYWMuYmFja3Bbb3V0XSkgewogICAgICBpbnQgbGVuID0gZGljdFtvdXRdLnNpemUoKTsKICAgICAgZHBbaSArIDFdID0gbWluKGRwW2kgKyAxXSAsIGRwW2kgKyAxIC0gbGVuXSsxICk7CiAgICB9CiAgfQoKICBjb3V0IDw8IChkcFttXSA+PSBJTkYgPyAtMSA6IGRwW21dKSA8PCAiXG4iOwoKfQoKaW50MzJfdCBtYWluKCkgewogIC8qZnJlb3Blbigid2hlcmVhbWkuaW4iLCAiciIsIHN0ZGluKTsqLwogIC8qZnJlb3Blbigid2hlcmVhbWkub3V0IiwgInciLCBzdGRvdXQpOyovCiAgZmFzdGlvKCk7CiAgaW50IG4gPSAxOwoKI2lmZGVmIE1VVExJX0NBU0UKICBjaW4gPj4gbjsKI2VuZGlmCiAgd2hpbGUgKG4tLSkKICAgIHNvbHZlKCk7CiAgcmV0dXJuIDA7Cn0=