#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'; }