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;
} 
posted @ 2022-09-17 11:31  WRuperD  阅读(3)  评论(0编辑  收藏  举报  来源

本文作者:DIVMonster

本文链接:https://www.cnblogs.com/guangzan/p/12886111.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

这是一条自定义内容

这是一条自定义内容