题意

有一个字符串,有一些匹配串,问匹配串是否是字符串的子序列。(子串是连续的,子序列是递增非连续的)

分析

显然我们可以贪心的去匹配,尽量匹配前面出现的字符。

然后我们可以定义一个数组,代表下一个字母出现的位置。

然后我们不停的跳就可以了。

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
const int inf = 0x3f3f3f3f;
const int maxn = 1001110;
const int M = 1e9+7;
int n,m;

char s[maxn],t[maxn];

int nex[maxn][26];

signed main()
{   
    cin>>(s+1);
    n = strlen(s+1);
    for(int i = 0; i < 26; i++) 
    {
        nex[n][i] = n+1;
    }
    for(int i = n-1; i >= 0; i--)
    {
        for(int j = 0; j < 26; j++) 
        {
            nex[i][j] = nex[i+1][j];
        }
        nex[i][s[i+1]-'a'] = i+1;
    }
    cin>>m;
    while(m--)
    {
        cin>>(t+1);
        int sz = strlen(t+1);
        bool ok = true;
        int k = 0;
        for(int i = 1; i <= sz && ok; i++) 
        {
            k = nex[k][t[i]-'a'];
            if(k > n) ok = 0;
        }
        if(ok) puts("Yes");
        else puts("No");
    }
    return 0;
}