题意:改变字符串一位,问能否找到与他相同的字符串,如果全部枚举字符串每一位的改变,要TEL,所以要优化,采用dfs,如果当前位没有相同,后面的斗不用再进行下去。
//#include <bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#include<string>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<stdlib.h>
#include<time.h>
#include <iomanip>
#define lowbit(x) (x&(-x))
#define inf 0x7fffffff
#define linf 0x7fffffffffffffff
#define fill(x,y) memset(x,y,sizeof(x))
#define fup(i,x,y) for(int i=(x);i<=(y);i++)
#define fdn(i,x,y) for(int i=(x);i>=(y);i--)
#define sp(x) setprecision(x)
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define sc(n) scanf("%s",n)
#define pf(x) printf("%d\n",x)
#define pfl(x) printf("%lld\n",x)
#define pff(x) printf("%lf\n",x)
#define N 100005
#define M 4000009
#define pi acos(-1)
#define eps 1e-2
//cout.setf(ios::fixed);
//freopen("out.txt","w",stdout);// freopen("in.txt","r",stdin);
using namespace std;
typedef long long ll;
typedef double db;
int t[2050005][3],tot=0;
int n,m;
char c[600005];
int q[2050005];
void add()
{
int len=strlen(c),r=0;
fup(i,0,len-1)
{
int id=c[i]-'a';
if(!t[r][id]) t[r][id]=++tot;
r=t[r][id];
}
q[r]=1;
}
int f;
void dfs(int x,int n,int r,int flag)
{
if(f) return ;
if(x==n)
{
if(q[r]&&flag) f=1;
return ;
}
fup(i,0,2)
{
int id=(c[x]-'a'+i)%3;
if(i==0&&t[r][id]) dfs(x+1,n,t[r][id],flag);
else if(i!=0&&t[r][id]&&!flag) dfs(x+1,n,t[r][id],1);
}
}
int main()
{
sdd(n,m);
fup(i,1,n)
{
sc(c);
add();
}
while(m--)
{
sc(c);
int len=strlen(c);
f=0;
dfs(0,len,0,0);
if(f) puts("YES");
else puts("NO");
}
return 0;
}