题意:给定一个n个数的数字序列,第i个数为a[i],每次操作会将a[i]插入或移到最前端:
1.若a[i]已经在序列中出现过,则将其移到最前端,并删除原出现位置
2.若a[i]未出现过,则直接将其插入到最前端
有q个询问,每个询问给出一个长度为m的序列,问是否在某个时刻询问序列与操作的序列相同,忽略后缀的0
n<=5e3,q<=2e3,sigma m<=2e6
思路:做法一:
实现参考了claris的代码,使用自然溢出哈希,下标标记的方法避免了重新排序或者map之类的带log,现场应该必挂
cf打多了确实喜欢为了方便加个map多个log之类的,还是要做BZOJ的时限紧张题
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef long double ld; 7 typedef pair<int,int> PII; 8 typedef pair<ll,ll> Pll; 9 typedef vector<int> VI; 10 typedef vector<PII> VII; 11 typedef pair<ll,ll>P; 12 #define N 200010 13 #define M 1000000 14 #define INF 1e9 15 #define fi first 16 #define se second 17 #define MP make_pair 18 #define pb push_back 19 #define pi acos(-1) 20 #define mem(a,b) memset(a,b,sizeof(a)) 21 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++) 22 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--) 23 #define lowbit(x) x&(-x) 24 #define Rand (rand()*(1<<16)+rand()) 25 #define id(x) ((x)<=B?(x):m-n/(x)+1) 26 #define ls p<<1 27 #define rs p<<1|1 28 #define fors(i) for(auto i:e[x]) if(i!=p) 29 30 const int MOD=1e8+7,inv2=(MOD+1)/2; 31 int p=1e4+7; 32 double eps=1e-6; 33 int dx[4]={-1,1,0,0}; 34 int dy[4]={0,0,-1,1}; 35 36 int a[N],b[N],ans[N],len[N],n; 37 ull c[N],h[N]; 38 39 int read() 40 { 41 int v=0,f=1; 42 char c=getchar(); 43 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 44 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 45 return v*f; 46 } 47 48 ll readll() 49 { 50 ll v=0,f=1; 51 char c=getchar(); 52 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 53 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 54 return v*f; 55 } 56 57 void calc(int n) 58 { 59 rep(i,1,n) h[i]=h[i-1]*p+b[i]; 60 } 61 62 void add(int x) 63 { 64 int k=0; 65 rep(i,1,n) 66 if(b[i]==x){k=i; break;} 67 if(k) 68 { 69 per(i,k,2) b[i]=b[i-1]; 70 b[1]=x; 71 } 72 else 73 { 74 per(i,n+1,2) b[i]=b[i-1]; 75 b[1]=x; 76 } 77 } 78 79 void solve() 80 { 81 n=read(); 82 int q=read(); 83 rep(i,1,n) a[i]=read(); 84 rep(i,1,q) 85 { 86 int m=read(); 87 len[i]=m; 88 rep(j,1,m) b[j]=read(); 89 calc(m); 90 c[i]=h[m]; 91 ans[i]=0; 92 } 93 rep(i,1,n) b[i]=0; 94 rep(i,0,n) 95 { 96 if(i) add(a[i]); 97 calc(n); 98 rep(j,1,q) 99 if(h[len[j]]==c[j]) ans[j]=1; 100 } 101 rep(i,1,q) 102 if(ans[i]) printf("Yes "); 103 else printf("No "); 104 } 105 106 int main() 107 { 108 //freopen("1.in","r",stdin); 109 //freopen("1.out","w",stdout); 110 int cas=read(); 111 while(cas--) solve(); 112 return 0; 113 }