思路:用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;
}

京公网安备 11010502036488号