序列自动机
通过预处理的方式,来快速检测一个字符串是不是母串的子序列
原理看这篇序列自动机-处理子串匹配
这里母串赋值和算长度不要变,固定模板
int nt[100005][26];
char a[100005];
scanf("%s",a+1);
void init() {
int len=strlen(a+1);
for(int i=len; i>=1; i--) {
for(int j=0; j<26; j++) {
nt[i-1][j]=nt[i][j];
}
nt[i-1][a[i]-'a']=i;
}
}
判断代码
char b[1005];
scanf("%s",b);
int len=strlen(b);
int p=0,f=0;
for(int i=0; i<len; i++) {
p=nt[p][b[i]-'a'];
if(p==0) {
f=1;
break;
}
}
if(f) {
cout<<"不是子序列"<<endl;
} else {
cout<<"是子序列"<<endl;
}
例题
https://nanti.jisuanke.com/t/38232
#include<iostream>
#include<string.h>
using namespace std;
char a[100005];
int nt[100005][26];
void init() {
int len=strlen(a+1);
for(int i=len; i>=1; i--) {
for(int j=0; j<26; j++) {
nt[i-1][j]=nt[i][j];
}
nt[i-1][a[i]-'a']=i;
}
}
int main() {
scanf("%s",a+1);
int t;
scanf("%d",&t);
init();
while(t--) {
char b[1005];
scanf("%s",b);
int len=strlen(b);
int p=0,f=0;
for(int i=0; i<len; i++) {
p=nt[p][b[i]-'a'];
if(p==0) {
f=1;
break;
}
}
if(f) {
cout<<"不是子序列"<<endl;
} else {
cout<<"是子序列"<<endl;
}
}
}