CF852G 救救孩子吧
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
struct TRIE{
struct AB{
int p,deep;
}p;
queue <AB> que;
int tree[550000][100],cp[550000],vist[550000];
int tot;
int hash(char ch)
{
if(ch=='?')
return 0;
return ch-'a'+1;
}
void init(char str[])
{
int p = 0,s;
for(int i=0;i<strlen(str);i++)
{
s = hash(str[i]);
if(tree[p][s]==0)
tree[p][s] = ++tot;
p = tree[p][s];
}
cp[p]++;
return ;
}
int find(char str[],int k)
{
int p = 0,s;
for(int i=0;i<strlen(str);i++)
{
s = hash(str[i]);
if(s>5)
continue;
if(tree[p][s]==0)
return 0;
p = tree[p][s];
}
if(vist[p]==k)
return 0;
vist[p] = k;
if(cp[p])
return cp[p];
return 0;
}
}T;
int ans;
int dfs(char str[],int kk)
{
int k = 0,nul[10];
for(int i=0;i<strlen(str);i++)
if(str[i]=='?')
nul[++k] = i;
if(k==0)
{
ans += T.find(str,kk);
}
else if(k==1)
{
for(int i='a';i<='e'+1;i++)
{
str[nul[k]] = i;
ans += T.find(str,kk);
}
}
else if(k==2)
{
for(int i='a';i<='e'+1;i++)
{
str[nul[1]] = i;
for(int j='a';j<='e'+1;j++)
{
str[nul[2]] = j;
ans += T.find(str,kk);
}
}
}
else if(k==3)
{
for(int l='a';l<='e'+1;l++)
{
str[nul[1]] = l;
for(int i='a';i<='e'+1;i++)
{
str[nul[2]] = i;
for(int j='a';j<='e'+1;j++)
{
str[nul[3]] = j;
ans += T.find(str,kk);
}
}
}
}
return ans;
}
char S[550];
int n,m;
int main()
{
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",S),
T.init(S);
for(int i=1;i<=m;i++)
{
scanf("%s",S);
ans = 0;
dfs(S,i);
printf("%d\n",ans);
}
// fclose(stdin);
// fclose(stdout);
return 0;
}