1. 程式人生 > >字串字典樹 CodeForces

字串字典樹 CodeForces

題意:改變字串一位,問能否找到與他相同的字串,如果全部列舉字串每一位的改變,要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; }