序列自动机模板题。
建出后直接看能不能被自动机接受就可以了。
#include<bits/stdc++.h>
#define fi first
#define se second
#define U unsigned
#define P std::pair<int,int>
#define LL long long
#define pb push_back
#define MP std::make_pair
#define all(x) x.begin(),x.end()
#define CLR(i,a) memset(i,a,sizeof(i))
#define FOR(i,a,b) for(int i = a;i <= b;++i)
#define ROF(i,a,b) for(int i = a;i >= b;--i)
#define DEBUG(x) std::cerr << #x << '=' << x << std::endl
const int MAXN = 5e6 + 5;
char str[MAXN];
int n;
struct SEQAM{ // 序列自动机 使用了类似 trie 图优化的东西
int ch[MAXN][26],frm[MAXN],tot = 0,rt = 0;
inline void build(){
CLR(ch,0);CLR(frm,0x3f);
FOR(i,1,n) frm[str[i]-'a'] = std::min(frm[str[i]-'a'],i);
ROF(i,n,0){
if(i < n){
ch[i][str[i+1]-'a'] = i+1;
}
FOR(j,0,25){
if(!ch[i+1][j]&&!ch[i][j]) ch[i][j] = frm[j];
else if(!ch[i][j]) ch[i][j] = ch[i+1][j];
}
}
}
}T;
char q[MAXN];
int main(){
scanf("%s",str+1);n = strlen(str+1);
T.build();
int t;scanf("%d",&t);
FOR(i,1,t){
scanf("%s",q+1);int tt = strlen(q+1);
int v = 0;
FOR(j,1,tt){
if(T.ch[v][q[j]-'a'] == 0x3f3f3f3f || T.ch[v][q[j]-'a'] <= v){
v = 0x3f3f3f3f;
break;
}
v = T.ch[v][q[j]-'a'];
}
puts(v!=0x3f3f3f3f?"Yes":"No");
}
return 0;
} 
京公网安备 11010502036488号