#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; //#define int long long typedef long long ll; typedef unsigned long long ul; typedef unsigned int ui; const ll mod = 1000000007; const ll INF = mod * mod; typedef pair P; #define stop char nyaa;cin>>nyaa; #define rep(i,n) for(int i=0;i=0;i--) #define Rep(i,sta,n) for(int i=sta;i=1;i--) #define Rep1(i,sta,n) for(int i=sta;i<=n;i++) typedef pair LP; typedef vector vec; typedef long double ld; typedef pair LDP; const ld eps = 1e-5; int dp[2001][2001]; int atype[2001]; int btype[2001]; void solve() { string a, b; cin >> a >> b; string nexa, nexb; rep(i, a.size()) { if (a[i] == '?') { atype[nexa.size() - 1] = 1; } else if (a[i] == '*') { atype[nexa.size() - 1] = 2; } else { nexa.push_back(a[i]); } } rep(i, b.size()) { if (b[i] == '?') { btype[nexb.size() - 1] = 1; } else if (b[i] == '*') { btype[nexb.size() - 1] = 2; } else { nexb.push_back(b[i]); } } a = nexa, b = nexb; int n = a.size(), m = b.size(); rep(i, n + 1) { rep(j, m + 1) { dp[i][j] = mod; } } dp[0][0] = 0; rep(i, n+1) { rep(j, m+1) { if (i == n) { if (j == m)continue; if (btype[j] > 0)dp[i][j + 1] = min(dp[i][j + 1], dp[i][j]); else dp[i][j + 1] = min(dp[i][j + 1], dp[i][j]+1); } else if (j == m) { if (atype[i] > 0)dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]); else dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]+1); } else { //いつもの dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + 1); dp[i][j+1] = min(dp[i][j+1], dp[i][j] + 1); dp[i + 1][j+1] = min(dp[i + 1][j+1], dp[i][j] + 1); if(a[i]==b[j])dp[i + 1][j + 1] = min(dp[i + 1][j + 1], dp[i][j]); //i飛ばす if (atype[i] > 0) { dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]); } //j飛ばす if (btype[j] > 9) { dp[i][j + 1] = min(dp[i][j + 1],dp[i][j]); } if (a[i] == b[j]) { //jは進んでiは残る if (atype[i] == 2) { dp[i][j + 1] = min(dp[i][j + 1], dp[i][j]); } //iは進んでjは残る if (btype[j] == 2) { dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]); } } } } } //cout << a << " "<