solution-cf852g
简单题
思路
虽然 $n$ 和 $m$ 很大,但是每个模式串的 $\texttt{?}$ 的数量至多有3个。所以,我们可以考虑把所有字符串丢进 $\texttt{map}$ 里统计贡献。对于每个模式串,直接暴力枚举每一种可能性,并进行统计。
注意,这里需要再用一个 $\texttt {map}$ 对于每一种模式串的可能性进行去重。
代码
#include<bits/stdc++.h>
using namespace std;
map <string, int> mp;
map <string, bool> mp2;
int ans = 0;
string q;
void dfs(string s ,int x, int n){
if(x == n){
if(mp2[s]) return ;
mp2[s] = 1;
ans += mp[s];
return ;
}
if(q[x] == '?'){
for(int i = 0; i < 5; i++){
string tmp = s + char(i + 'a');
dfs(tmp, x+1, n);
}
dfs(s, x+1, n);
}else{
string tmp = s + q[x];
dfs(tmp, x+1, n);
}
}
int main(){
int n, m;
cin>>n>>m;
for(int i = 1; i <= n; i++){
string s;
cin>>s;
mp[s]++;
}
for(int i = 1; i <= m; i++){
mp2.clear();
cin>>q;
int l = q.length();
dfs("", 0, l);
cout<<ans<<endl;
ans = 0;
}
return 0;
}