图片说明
图片说明
思路:用nex[i][a'b'...'z]表示在i位置后第一次出现a'b'....'z的位置,从后往前推nex数组,用last['a'b..'z]表示最早出现的位置。通过nex数组这样我们查询B串是否出现就是O(B的长度)

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
#include <sstream>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<cmath>
#include<cctype>
#include<cstring>
#include<cstdlib>
#define MAXX 100005
#define SIS std::ios::sync_with_stdio(false)
#define ll long long
#define INF 0x3f3f3f3f
#include<bits/stdc++.h>
using namespace std;
const int MAX =1e6+20;
const double PI = 3.14159265359;
//const int mod = 1e9 + 7;

char ch[MAX];
char s[MAX];
int nex[MAX][30],last[MAX];
void init()
{
    memset(last,-1,sizeof(last));
    int len=strlen(s);
    for(int i=len-1;i>=0;i--)
    {
        for(int k=0;k<=26;k++)
        {
            nex[i][k]=last[k];
        }
        last[s[i]-'a']=i;
    }
}
int judge()
{
    int len=strlen(ch);
    int k=last[ch[0]-'a'];///获取子串第一个字母在文本串的位置
    if(k==-1)return 0;
    for(int i=1;i<len;i++)
    {
        k=nex[k][ch[i]-'a'];///更新位置
        if(k==-1)return 0;
    }
    return 1;

}
int main()
{
    scanf("%s",s);
    init();
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",ch);
        if(judge())
            printf("Yes\n");
        else
            printf("No\n");
    }

    return 0;

}