听说正解是链表,然而被我暴力水过了
先开vector记录每个数在原串中出现的位置
之后对于每个匹配串的每一位,找比当前位置大的第一个当前元素是哪个,有就更新,没有就“NIE”
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int Mx=;
vector <int> v[Mx];
int n,m,c[Mx],num[Mx];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&c[i]);
v[c[i]].push_back(i);
}
scanf("%d",&m);
while(m--)
{
int len,jud=,p=-;scanf("%d",&len);
for(int i=;i<=len;i++)
{
int a;scanf("%d",&a);
if(jud==) continue;
vector<int>::iterator V=upper_bound(v[a].begin(),v[a].end(),p);
if(V!=v[a].end()) p=*V;
else jud=;
}
if(jud==) puts("NIE");
else puts("TAK");
}
return ;
}