题目分析:
序列自动机板子题。注意字符串字符均为小写字母,因此我们设一个T数组,T[i][j]表示在i位置右边,离i最近的j+‘a’字母的下标,我们可以从后到前求出T数组。在询问时,需要对每个字符串判断,我们可以利用T数组在主串上进行跳跃匹配。若该字符串利用T数组能匹配到尾部,输出YES,否则输出NO。
时间复杂度:O(26|A|+∑|Bi|)
代码部分:
#include<bits/stdc++.h> using namespace std; int T[1000005][26]={0}; char A[1000005]; int main() { int i,j,N,L; scanf("%s%d",A+1,&N); L=strlen(A+1); for(i=L;i>=0;i--) { for(j=0;j<26;j++)T[i][j]=T[i+1][j]; if(i<L)T[i][A[i+1]-'a']=i+1; } while(N--) { scanf("%s",A); for(j=i=0;A[i]!='\0';i++) { if(T[j][A[i]-'a'])j=T[j][A[i]-'a']; else break; } A[i]=='\0'?printf("Yes\n"):printf("No\n"); } return 0; }