#include <cstdio> #include <map> #include <iostream> #include<cstring> #include<bits/stdc++.h> #define ll long long int #define M 6 using namespace std; inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;} int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1}; int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1}; const int inf=0x3f3f3f3f; const ll mod=1e9+7; int n,m,q; int a[100007]; //询问数组 int temp[107]; bool vis[100007]; //标记为需求数 int num[100007]; //需求数的数量 int main(){ ios::sync_with_stdio(false); while(~scanf("%d%d",&n,&m)){ if(!n&&!m) break; for(int i=1;i<=n;i++) scanf("%d",a+i); for(int i=1;i<=m;i++){ memset(vis,0,sizeof(vis)); memset(num,0,sizeof(num)); scanf("%d",&q); int sum=0; for(int j=1;j<=q;j++){ scanf("%d",temp+j); if(!vis[temp[j]]) vis[temp[j]]=1,sum++; } int ans=inf; int u,v,s; u=v=1; s=0; while(1){ while(v<=n&&s<sum){ if(vis[a[v]]&&!num[a[v]]) num[a[v]]++,s++; //如果是需求数且没出现则s++ else if(num[a[v]]) num[a[v]]++;//不然只记录下数目 v++; } if(s<sum) break; ans=min(ans,v-u); if(vis[a[u]]&&num[a[u]]==1) num[a[u]]--,s--; //与上面对应 else if(num[a[u]]>1) num[a[u]]--; u++; } cout<<ans<<endl; } } }
原文:https://www.cnblogs.com/wmj6/p/10386505.html