#include <bits/stdc++.h>

using namespace std;

void set_max(int& a,int b){
	a = max(a,b);
}

int DP[1001][1001];

bool mozem(char x, string b){
	for(auto y : b){
		if(x == y) return 1;
		if(y == '?') return 1;
	}
	return 0;
}

int main() {
	int n; cin>>n;
	string s; cin>>s;
	int m; cin >>m;
	string pattern; cin >>pattern;

	vector<string> pat;
	vector<vector<int>> trans(m);
	vector<int> stak;

	int last = -1;
	bool hran = false;

	for(int i = 0;i < m;i++){
		char p = pattern[i];
		if(p == '('){
			stak.push_back(pat.size());
		}else if(p == ')'){
			last = stak.back();
			stak.pop_back();
		}else if(p == '*'){
			if(pattern[i-1] == ')'){
				trans[pat.size()-1].push_back(last);
				trans[last].push_back(pat.size());
			}else {
				trans[pat.size()-1].push_back(pat.size()-1);
				trans[pat.size()-1].push_back(pat.size());
			}
		}else if(p == '['){
			pat.push_back({});
			hran = true;
		}else if(p ==']'){
			hran = false;
		}else{
			if(hran){
				pat.back().push_back(p);
			}else{
				pat.push_back({p});
			}
		}
	}

	int N = n, M = pat.size();
	for(int i = 0;i < N+1;i++)for(int j = 0;j < M+1;j++) DP[i][j] = INT_MIN;
	DP[0][0] = 0;

	for(int i = 0; i < N+1;i++)for(int j = 0;j < M+1;j++){
		if(i != N && j != M)
		if(mozem(s[i], pat[j])){
			for(int x : trans[j])if(x <= j){
				set_max(DP[i+1][x], DP[i][j] + 1);
			}
			set_max(DP[i+1][j+1], DP[i][j] + 1);
		}
		if(j != M){ 
			for(int x : trans[j])if(x > j){
				set_max(DP[i][x], DP[i][j]);
			}
		}
		if(i != N) set_max(DP[i+1][j], DP[i][j]);
	}
	if(DP[N][M] < 0) cout << -1 << endl;
	else cout << DP[N][M] << endl;
}