rt,代码如下:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int T = 15, N = 100005, q = 10;
string s;
char f[N];
int n, s1cnt, s2cnt;
int lenS1[T], lenS2[T];
ll p[N], hashs1[T][N], hashs2[T][N], hashf[N];
void init(int x) {
p[0] = 1;
for (int i = 1; i <= x; i++) p[i] = p[i - 1] * q;
}
ll hfind(int x, int y) {
return hashf[x] - hashf[x - y] * p[y];
}
ll ffind(int x) {
return hashf[x] % q;
}
int main() {
cin >> s >> n;
int lens = s.size();
s[lens] = '?';
for (int i = 0; i <= lens; i++) {
if (s[i] == '*') {
s1cnt++;
for (int j = i + 1; j <= lens; j++) {
i++;
if (s[j] == '*' || s[j] == '?') break;
lenS1[s1cnt]++;
hashs1[s1cnt][lenS1[s1cnt]] = hashs1[s1cnt][lenS1[s1cnt] - 1] * q + s[j] - 'a' + 1;
}
}
if (s[i] == '?') {
s2cnt++;
for (int j = i + 1; j <= lens; j++) {
i++;
if (s[j] == '*' || s[j] == '?') break;
lenS2[s2cnt]++;
hashs2[s2cnt][lenS2[s2cnt]] = s[j] - 'a' + 1;
}
}
}
for (int i = 1; i <= n; i++) {
scanf("%s", f + 1);
int lenf = strlen(f + 1);
init(lenf);
bool flag1 = 0, flag2 = 0;
memset(hashf, 0, lenf);
for (int j = 1; j <= lenf; j++) hashf[j] = hashf[j - 1] * q + f[j] - 'a' + 1;
for (int j = 1; j <= s1cnt; j++) {
for (int k = lenS1[j]; k <= lenf; k++) {
ll tmp = hfind(k, lenS1[j]);
if (hashs1[j][lenS1[j]] == tmp) {
flag1 = 1;
break;
}
}
}
for (int j = 1; j <= s2cnt; j++) {
for (int k = 1; k <= lenf; k++) {
ll tmp = ffind(k);
for (int m = 1; m <= lenS2[j]; m++) {
if (hashs2[j][m] == tmp) {
flag2 = 1;
break;
}
}
}
}
if (flag1 == 1 && flag2 == 1) printf("YES\n");
else printf("NO\n");
}
return 0;
}