题目
多组询问查询某个串是否为模式串的子序列
分析
考虑用子序列自动机做,匹配的时候显然选择靠前的,用个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;
}