题目分析:
序列自动机板子题。注意字符串字符均为小写字母,因此我们设一个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;
}