#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main() {
string str1, str2;
while (cin >> str1 >> str2) { //str1是pattern,str2是要匹配的
int m = str1.size();
int n = str2.size();
vector<vector<bool>> v(m + 1, vector<bool>(n + 1,
false)); //这个含义是前i个
//能否匹配字符串的前j个,能的话为true。
v[0][0] = true;//pattern的前0个匹配字符串的前0个应该为true,大家都是空的
for (int i = 1; i < m + 1; i++) {
//'*'因为这个符号可以匹配0个
if (str1[i - 1] == '*') //如果第i个字符为*
v[i][0] = v[i -
1][0]; //为什么不直接赋值true,而要让他等于前一个值,因
//为要防止这种情况'*A*'这个从2开始就该都是false的,如果直接赋值true或
//者false那么第三个被错误赋值
for (int j = 1; j < n + 1; j++) {
if (str1[i - 1] == '*' &&
isalnum(str2[j - 1])) { //这里判断字符串里的必须
//要是字母或者数字,如果是符号的话,那么它的转移方程只有不用'*'的
//状态,也就是最后一个判断条件。举个例子pattern:t?t12*.* 字符串:
//txt123.xls pattern'.'后面那个'*'和字符串的'.'应该是可以匹配的
//如果没有后面那个条件这里会直接跳过变为false
v[i][j] = v[i - 1][j] || v[i][j - 1]; //不用'*'和用'*'两种状态
//得到现在的状态
} else if (toupper(str1[i - 1]) == (toupper(str2[j - 1]))) {
v[i][j] = v[i - 1][j - 1]; //这里先转换为大写还要判断相等,这个
//函数对其它符号不会改变
} else if (str1[i - 1] == '?' && isalnum(str2[j - 1])) {
v[i][j] = v[i - 1][j - 1]; //如果是问好那么只能匹配一个,也就是
//根据前面来判断现在可不可以匹配
} else if (str1[i - 1] == '*') { //这里就是第一个条件说的那个例外
v[i][j] = v[i - 1][j]; //只能是不用'*'的情况下的转移方程
}
}
}
cout << boolalpha << v[m][n] <<
endl; //要输出pattern是否匹配字符串那么就是
//前m个和字符串的前n个是不是true。
}
}