Trie树上暴力
复杂度不虚
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
inline int read(char *s){
char c=nc(); int len=0;
for (;!(c>='a' && c<='z');c=nc());
for (;c>='a' && c<='z';s[++len]=c,c=nc()); s[++len]=0; return len-1;
}
int clk;
struct TRIE{
struct node{
int ch[26];
int val,tim;
}T[200005];
int rt,cnt;
TRIE(){
rt=++cnt;
}
void add(char *s,int len){
int p=rt;
for (int i=1;i<=len;i++)
{
if (!T[p].ch[s[i]-'a']) T[p].ch[s[i]-'a']=++cnt;
p=T[p].ch[s[i]-'a'];
}
T[p].val=1;
}
int query(char *s,int* nxt){
int p=rt;
for (int i=nxt[0];i;i=nxt[i])
{
if (!T[p].ch[s[i]-'a']) return 0;
p=T[p].ch[s[i]-'a'];
}
if (!T[p].val || (T[p].val && T[p].tim==clk)) return 0;
T[p].tim=clk; return 1;
}
}Trie;
int n,m,len,ans;
char str[25];
int nxt[25];
int vst[10005];
int main()
{
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n); read(m);
for (int i=1;i<=n;i++)
{
len=read(str);
Trie.add(str,len);
}
for (int i=1;i<=m;i++)
{
clk++;
len=read(str);
cl(nxt);
for (int i=0;i<len;i++)
nxt[i]=i+1;
nxt[len]=0;
if (Trie.query(str,nxt))
printf("-1\n");
else
{
ans=0;
for (int i=1;i<=len;i++)
{
nxt[i-1]=nxt[i];
ans+=Trie.query(str,nxt);
nxt[i-1]=i;
}
for (int i=1;i<=len;i++)
{
char ch=str[i];
for (int j=0;j<26;j++)
if (ch!='a'+j)
{
str[i]='a'+j;
ans+=Trie.query(str,nxt);
}
str[i]=ch;
}
for (int j=0;j<26;j++)
{
str[len+1]='a'+j;
for (int i=0;i<=len;i++)
{
nxt[len+1]=nxt[i]; nxt[i]=len+1;
ans+=Trie.query(str,nxt);
nxt[i]=nxt[len+1];
}
}
printf("%d\n",ans);
}
}
return 0;
}