【gym102394L】LRU Algorithm(自然溢出哈希)

题意:给定一个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\n");
103       else printf("No\n");
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 }

 

posted on 2019-11-12 16:44  myx12345  阅读(434)  评论(0编辑  收藏  举报

导航