#include <bits/stdc++.h>
using namespace std;
#define Task "LAUGH"
#define signed main() main()
#define sp " "
#define endl "\n"
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define mp(x, y) make_pair(x, y)
#define F first
#define S second
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef vector<int> vi;
constexpr int maxn = 1e5 + 5;
int n, m;
string s, p;
int dp[maxn];
struct Node {
int child[4];
int link;
vector<int> out;
Node() {
memset(child, -1, sizeof(child));
link = 0;
}
};
vector<Node> tries;
int GetId(char ch) {
if(ch == 'a') return 0;
if(ch == 'h') return 1;
if(ch == 'c') return 2;
return 3;
}
main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
if(fopen(Task".inp", "r")) {
freopen(Task".inp", "r", stdin);
freopen(Task".out", "w", stdout);
}
cin >> n >> s;
m = sz(s);
tries.emplace_back();
for(int i = 1; i <= n; i++) {
cin >> p;
int cur = 0;
for(char c : p) {
int x = GetId(c);
if(tries[cur].child[x] == -1) {
tries[cur].child[x] = sz(tries);
tries.emplace_back();
}
cur = tries[cur].child[x];
}
tries[cur].out.push_back(sz(p));
}
queue<int> q;
for(int i = 0; i <= 3; i++) {
int cur = tries[0].child[i];
if(cur != -1) {
tries[cur].link = 0;
q.push(cur);
} else {
tries[0].child[i] = 0;
}
}
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = 0; i <= 3; i++) {
int v = tries[u].child[i];
if(v != -1) {
tries[v].link = tries[tries[u].link].child[i];
for(int l : tries[tries[v].link].out)
tries[v].out.push_back(l);
q.push(v);
} else {
tries[u].child[i] = tries[tries[u].link].child[i];
}
}
}
vector<vi> luu(m + 1);
int cur = 0;
for(int i = 1; i <= m; i++) {
cur = tries[cur].child[GetId(s[i - 1])];
for(int l : tries[cur].out) {
luu[i].push_back(l);
}
}
int ans = 0;
for(int i = 1; i <= m; i++) {
memset(dp, 0, sizeof(dp));
dp[i - 1] = 1;
for(int j = i; j <= m; j++) {
for(int l : luu[j]) {
if(j - l >= i - 1 && dp[j - l]) {
dp[j] = 1;
break;
}
}
if(dp[j]) {
ans = max(ans, j - i + 1);
}
}
}
cout << ans << endl;
return 0;
}