序列自动机入门

Prob

给你一个长度为1000000字符串s
然后给你1000000个问题
问a是不是s的子序列

Sol:

序列自动机是用来判断是否是子序列的算法 时间复杂度是 O(len)

nx[i][j] 数组存的是在 s 中第 i 位后面第一个 j 字母出现的位置

Prog:

#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';
using namespace std;
typedef long long ll;
typedef pair <int,int> pii;
const ll mod = 1e9 + 7;
const int maxn = 1e6 + 10;
int n, t, nxt[maxn][30];
char s[maxn], str[maxn];

int main() {
	scanf("%s", s+1);
	int len = strlen(s+1);
	for(int i=len; i; i--) //逆循环 
	{
		for(int j=0; j<26; j++) //26个字母 
		    nxt[i-1][j] = nxt[i][j];
		nxt[i-1][s[i]-'a'] = i;
	}
	int a,b;
/*	while (true)
	{
		cin>>a>>b;
		cout<<nxt[a][b]<<endl;
		
	 } 
*/
	scanf("%d", &t);
	while(t--)
	{
		scanf("%s", str);
		int lenc = strlen(str), f = 0;
		for(int i=0, now=0; i<lenc; i++)
		{
			now = nxt[now][str[i]-'a'];
			if(!now) 
			{
				f = 1;
				break;
			}
		}
		if(f) puts("No");
		else puts("Yes");
	}
}

  

猜你喜欢

转载自www.cnblogs.com/cutemush/p/12627545.html