字符串字典树 CodeForces - 514C

时间:2022-12-30 13:12:24

CodeForces - 514C

题意:改变字符串一位,问能否找到与他相同的字符串,如果全部枚举字符串每一位的改变,要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;
}