题意
给一些模式串,一些编辑方式
一些待查询串,求该串是否不用编辑就是一个模式串
若不是,求编辑一次变为的模式串数量。题解
模式串建成trie树,询问1直接查询
询问2 dfs即可。- 代码
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 200001
using namespace std;
struct node{
node *ch[26];
bool is,used;
node(){memset(ch,0,sizeof ch);}
void* operator new (size_t){
static node pool[MAXN],*C=pool;
return C++;
}
}*root=new node();
bool flag=0;
void insert(char *s){
node *p=root;
for(int i=0;s[i];i++){
if(!p->ch[s[i]-'a']) p->ch[s[i]-'a']=new node();
p=p->ch[s[i]-'a'];
}
p->is=1;
}
int ans=0;
int len=0;
node*sta[MAXN];
int top=0;
void dfs(node *p,char *s,int now,int cnt){
if(now==len&&p->is==1&&cnt) {flag=1;return;}
if(now==len&&p->is==1&&!cnt) {if(!p->used)ans++,sta[++top]=p,p->used=1;return;}
if(cnt&&now<len)
dfs(p,s,now+1,cnt-1);
for(int i=0;i<26;i++)
if(p->ch[i]&&!flag){
if(s[now]-'a'==i)
dfs(p->ch[i],s,now+1,cnt);
if(cnt){
dfs(p->ch[i],s,now,cnt-1);
if(s[now]-'a'!=i)
dfs(p->ch[i],s,now+1,cnt-1);
}
}
}
char s[MAXN];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",s);
insert(s);
}
for(int i=1;i<=m;i++){
scanf("%s",s);
len=strlen(s);
flag=ans=0;
dfs(root,s,0,1);
if(flag) puts("-1");
else printf("%d\n",ans);
for(int i=1;i<=top;i++)
sta[i]->used=0;
top=0;
}
return 0;
}