题意:给一个字符串S, 长度1e5,再给出N(1e5)个字符串,问每个字符串是不是S的子序列
思路:记录S中每个字符出现的位置,二分,具体看代码
代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxx = 1e5 + 5;
char s[maxx];
char a[1005];
int v[200][maxx];
int pp[200];
int main()
{
scanf("%s", s);
int n;
scanf("%d", &n);
getchar();
int len = strlen(s);
for(int i = 0; i < len; ++i)
v[(int)s[i]][pp[(int)s[i]]++] = i;
while(n--)
{
scanf("%s", a);
int lena = strlen(a);
int last = -1;
bool judge = 1;
for(int i = 0; i < lena; ++i)
{
int lb = upper_bound(v[(int)a[i]], v[(int)a[i]]+pp[(int)a[i]], last)-v[(int)a[i]];
if(lb == pp[(int)a[i]])
{
judge = 0;
break;
}
else
last = v[(int)a[i]][lb];
}
if(judge)
puts("YES");
else
puts("NO");
}
return 0;
}