zoukankan      html  css  js  c++  java
  • 【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
    ");
    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 }
  • 相关阅读:
    [原创]存储过程,insert,case when then,处理性别问题 Virus
    [原创]c#,数据结构,栈 Virus
    [原创]软件自动化测试和.NET中的反射 Virus
    [原创]反射,.NET,委托 Virus
    《博客园精华集--NET3.x分册》第三轮结果
    (翻译)《Expert .NET 2.0 IL Assembler》 详要目录 更新到第8章
    MSIL翻译中的问题贴
    (翻译)《Expert .NET 2.0 IL Assembler》 第一章 简单示例 1.2 简单示例(二)
    (翻译)《Expert .NET 2.0 IL Assembler》 第一章 简单示例 1.2 简单示例(一)
    第三轮进度汇总
  • 原文地址:https://www.cnblogs.com/myx12345/p/11843032.html
Copyright © 2011-2022 走看看