Luogu P5826 【模板】子序列自动机

题链

分析

显然每次可以选当前匹配到的后面第一个可选的

可以把所有数的位置都记下来,每次upper_bound下一个位置即可

#include<bits/stdc++.h>
#define pb push_back
using namespace std;

const int N=1e5+4;
int n,m,q;
vector<int>V[N];

int main() {
	int t; scanf("%d%d%d%d",&t,&n,&q,&m);
	for(int i=1;i<=n;i++) {
		int t;scanf("%d",&t);
		V[t].pb(i);
	}	
	while(q--) {
		scanf("%d",&m);
		int now=0; bool fl=0;
		for(int i=1;i<=m;i++) {
			int t; scanf("%d",&t);
			if(fl) continue;
			auto u=upper_bound(V[t].begin(),V[t].end(),now);
			if(u==V[t].end()) {
				puts("No"); fl=1;
				continue;
			}
			now=*u;
		}
		if(!fl) puts("Yes");
	}
	return 0;
}
posted @ 2021-06-08 23:22  wwwsfff  阅读(45)  评论(0编辑  收藏  举报