序列自动机:next[i][j] 表示在原串s第i位后面的第一个出现的位置,设串长为
,字符集大小为
,预处理时间复杂度为
,代码如下
链接:https://ac.nowcoder.com/acm/contest/392/J
题意:给你一个字符串A,和m个字符串s[i]
问s[i] 是否是A的一个子序列
序列自动机模板题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define ll long long
const int maxn = 1e6+5;
using namespace std;
char A[maxn],s[maxn];
int nextc[maxn][27],m;
int main()
{
scanf("%s",A+1);
int n = strlen(A+1);
for(int i=n;i>0;i--) {
for(int j=0;j<26;j++) {
nextc[i-1][j]=nextc[i][j];
}
nextc[i-1][A[i]-'a']=i;
}
scanf("%d",&m);
while(m--) {
scanf("%s",s);
int len = strlen(s),flag=1;
for(int i=0,now=0;i<len;i++) {
now = nextc[now][s[i]-'a'];
if(now == 0) {
flag=0;
break;
}
}
if(flag) {
printf("Yes\n");
}else printf("No\n");
}
return 0;
}