题解
题意:n个只包含’a’~‘e’的母串,m个含有’?'的子串,‘?’可以是任意一个字母或者是空,问每个子串能匹配上的母串的个数
由于’?'最多只有3个,可以暴力dfs枚举一下所有字母,
不过在由于’?'可能为空,dfs得到的答案可能会被重复统计,所以再开个vis数组来判断有否被统计过
string.substr( pos - 起点,n - 长度 )
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m, K;
map<string, int> mp;
map<string, int> vis;
int dfs(string s) {
int len = s.length();
int pos = 0;
while (pos < len && s[pos] != '?')pos++;
if (pos == len) {
if (!vis[s]) {
vis[s] = 1;
return mp[s];
}
return 0;
}
int res = 0;
for (int i = 0; i < 5; ++i) {
s[pos] = (char) ('a' + i);
res += dfs(s);
}
res += dfs(s.substr(0, pos) + s.substr(pos + 1, len - pos + 1));
return res;
}
string s;
int main() {
ios::sync_with_stdio(0);
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> s;
mp[s]++;
}
for (int i = 1; i <= m; ++i) {
cin >> s;
vis.clear();
cout << dfs(s) << endl;
}
return 0;
}