子序列自動機

vector+二分
比可持久化線段樹好寫多了,速度也差不到哪裏去。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<deque>
#include<cstdlib>
#include<ctime>
#define dd double
#define ld long double
#define ll long long
#define ull unsigned long long
#define N 100010
#define M number
using namespace std;

const int INF=0x3f3f3f3f;

inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}

int type,n,q,m,a[N],b[N];
vector<int> v[N];

int main(){
    type=read(),n=read(),q=read(),m=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
        v[a[i]].push_back(i);
    }
    for(int i=1;i<=q;i++){
        int l=read(),last=0;bool op=1;
        for(int j=1;j<=l;j++) b[j]=read();
        for(int j=1;j<=l;j++){
            vector<int>::iterator it=upper_bound(v[b[j]].begin(),v[b[j]].end(),last);
            if(it==v[b[j]].end()){
                op=0;break;
            }
            last=*it;
        }
        if(op) printf("Yes\n");
        else printf("No\n");
    }
}

學習博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章