#子序列自动机,vector#洛谷 3500 [POI2010]TES-Intelligence Test

题目

多组询问查询某个串是否为模式串的子序列


分析

考虑用子序列自动机做,匹配的时候显然选择靠前的,用个vector查询最近的就行了


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <vector>
#define rr register
using namespace std;
const int N=1000011;
vector<int>::iterator it;
int n,Q; vector<int>K[N]; 
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
signed main(){
	n=iut();
	for (rr int i=1;i<=n;++i)
	    K[iut()].push_back(i);
	Q=iut();
	for (rr int i=1;i<=Q;++i){
		rr int len=iut(),now=0,flag=1;
		for (rr int j=1;j<=len;++j){
			rr int x=iut(); if (!flag) continue;
			it=upper_bound(K[x].begin(),K[x].end(),now);
			if (it==K[x].end()) flag=0;
			    else now=*it;
		}
		puts(flag?"TAK":"NIE");
	}
	return 0;
} 
原文地址:https://www.cnblogs.com/Spare-No-Effort/p/13947676.html