序列自动机

通过预处理的方式,来快速检测一个字符串是不是母串的子序列

原理看这篇序列自动机-处理子串匹配

这里母串赋值和算长度不要变,固定模板

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;
		}
	}
}
posted @ 2021-07-22 17:58  cheems~  阅读(30)  评论(0编辑  收藏  举报