#include <bits/stdc++.h>

using namespace std;

#define ll long long 
#define rep(i,n) for(int i = 0; i<n;i++)


int n, m;
string s, r;

int dp[1000][1000][2];
vector<int> skips;
vector<string> options;

bool ischar(char c){
    return c>='a'&&c<='z';
}

int total(int i, int j, bool skipped){
    if(j==-1) return 0;
    if(i==-1)return -1;

    if(dp[i][j][skipped]!=-1)
        return dp[i][j][skipped];
    dp[i][j][skipped] = 0;

    int res = total(i-1, j, false);
    if(ischar(r[j])){
        if(r[j]==s[i])            
            res = max(res, total(i-1, j-1, false)+1);
        if(j<m-1&&r[j+1]=='*'){
            if(r[j]==s[i])
                res = max(res, total(i-1, j, false)+1);
        }
    }
    if(r[j]=='?'){
        res = max(res, total(i-1, j-1, false)+1);
        if(j<m-1&&r[j+1]=='*'){
            res = max(res, total(i-1, j, false)+1);
        }
    }
    if(r[j] == '*'){
        int skip = j-1;
        if(!ischar(r[j-1]))skip = skips[j-1];
        res = max(res, total(i, skip, false));
        res = max(res, total(i, j-1, false));
    }
    if(r[j]==']'){        
        res = max(res, total(i, j-1, false)); 
        rep(k, options[j].size()){
            if(options[j][k]==s[i]){
                res = max(res, total(i-1, skips[j], false)+1);
            }
        }       
    }
    if(r[j]==')'){
        res = max(res, total(i, j-1, false));
    }
    if(r[j]=='['){
        res = max(res, total(i, j-1, false));
        if(skips[j]+1<m && r[skips[j]+1]=='*')
            res = max(res, total(i, skips[j], false));
    }
    if(r[j]=='('){
        res = max(res, total(i, j-1, false));
        if(skips[j]+1<m && r[skips[j]+1]=='*')
            res = max(res, total(i, skips[j], false));
    }


    dp[i][j][skipped] = res;
    return res;
}

int main() {
    rep(i, 1000){
        rep(j, 1000){
            rep(k,2){
                dp[i][j][k] = -1;
            }
        }
    }
    cin>>n;    
    cin>>s;

    cin>>m;
    skips.assign(m, -1);
    cin>>r;
    options.assign(m, {});


    vector<int> pbuffer;
    vector<int> bbuffer;

    rep(i,m){
        if(r[i] == '(')
            pbuffer.push_back(i);
        if(r[i]==')')
        {
            skips[i] = pbuffer.back();
            skips[pbuffer.back()] = i;
            pbuffer.pop_back();
        }
        if(r[i] == '[')
            bbuffer.push_back(i);
        if(r[i]==']')
        {
            skips[i] = bbuffer.back();
            skips[bbuffer.back()] = i;
            for(int j = bbuffer.back()+1; j<i; j++){
                options[i].push_back(r[j]);
            }
            bbuffer.pop_back();
        }
    }

    cout<<total(n-1, m-1, false)<<'\n';
}