题目描述
给出S,及Q个询问
每个询问给出T,判断T是否是S的子序列
思路
直接找,S可以预处理一下
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int cha[100250][30], c[30];
int n, m;
string s;
int check()
{
s = ' ' + s;
int k = 0, t = 0, len = s.length();
while(++k <= len && (t || k == 1))
t = cha[t][s[k] - 'a' + 1];
if(k > len)return 1;
else return 0;
}
int main()
{
scanf("%d%d", &n, &m);
cin >> s;
s = ' ' + s;
for(int i = n; i >= 1; --i)
{
for(int j = 1; j <= 26; ++j)
cha[i][j] = c[j];
c[s[i] - 'a' + 1] = i;
}
for(int i = 1; i <= 26; ++i)
cha[0][i] = c[i];
while(m--)
{
cin >> s;
if(check())printf("YES\n");
else printf("NO\n");
}
return 0;
}