题意
有一个字符串,有一些匹配串,问匹配串是否是字符串的子序列。(子串是连续的,子序列是递增非连续的)
分析
显然我们可以贪心的去匹配,尽量匹配前面出现的字符。
然后我们可以定义一个数组,代表下一个字母出现的位置。
然后我们不停的跳就可以了。
#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;
} 
京公网安备 11010502036488号