• loj#6169. 相似序列 hash+主席树


    因为他的相似是在排完序下的

    那我就在排序的情况下hash啊

    这怎么hash啊

    主席树啊!

    没了

      1 #include <bits/stdc++.h>
      2 #define MAXNODE 5000000
      3 #define MAX 200000
      4 using namespace std;
      5 int NODE,T,n,q,_l,_r,L,R;
      6 int a[MAX],val[MAX],ma[MAX],root[MAX];
      7 int tr[MAXNODE],c[MAXNODE][2];
      8 int change(int acc,int l,int r,int x,int y)
      9 {
     10     if(l==r)
     11     {
     12         tr[++NODE]=y+tr[acc];
     13         c[NODE][0]=c[NODE][1]=0;
     14         return NODE;
     15     }
     16     int now=++NODE,mid=l+r>>1;
     17     if(x<=mid)
     18         c[now][0]=change(c[acc][0],l,mid,x,y),
     19         c[now][1]=c[acc][1];
     20     else
     21         c[now][0]=c[acc][0],
     22         c[now][1]=change(c[acc][1],mid+1,r,x,y);
     23     tr[now]=tr[c[now][0]]+tr[c[now][1]];
     24     return now;
     25 }
     26 int tre(int rt,int x)
     27 {
     28     int ret=0;
     29     for(int now=root[rt],l=1,r=MAX;l<r;)
     30     {
     31         int mid=l+r>>1;
     32         if(x<=mid)
     33         {
     34             r=mid,now=c[now][0];
     35             if(r==x) return ret+tr[now];
     36         }
     37         if(x>mid)
     38             l=mid+1,ret+=tr[c[now][0]],now=c[now][1];
     39     }
     40     return ret;
     41 }
     42 int ha(int l,int r,int L,int R)
     43 {
     44     return tre(r,R)-tre(r,L-1)-tre(l-1,R)+tre(l-1,L-1);
     45 }
     46 int main()
     47 {
     48     srand(time(0));
     49     for(scanf("%d",&T);T;T--)
     50     {
     51         scanf("%d%d",&n,&q);
     52         for(int i=1;i<=n;i++)
     53         {
     54             scanf("%d",&a[i]);
     55             val[i]=ma[a[i]]?ma[a[i]]:(ma[a[i]]=rand());
     56     //        val[i]=a[i];
     57         }
     58         root[0]=1;c[1][0]=c[1][1]=0;tr[1]=0;NODE=1;
     59         for(int i=1;i<=n;i++)
     60             root[i]=change(root[i-1],1,MAX,a[i],val[i]);
     61         for(int i=1;i<=q;i++)
     62         {
     63             scanf("%d%d%d%d",&_l,&_r,&L,&R);
     64             bool gg=0;
     65             for(int l=1,r=MAX;l<r;)
     66             {
     67                 int mid=l+r>>1;
     68                 if(ha(_l,_r,l,mid)==ha(L,R,l,mid))
     69                     l=mid+1;
     70                 else
     71                 if(ha(_l,_r,mid+1,r)==ha(L,R,mid+1,r))
     72                     r=mid;
     73                 else
     74                 {
     75                     int ll=l,rr=mid;
     76                     for(;ll<rr;)
     77                     {
     78                         int mm=ll+rr>>1;
     79                         if(ha(_l,_r,ll,mm)==ha(L,R,ll,mm)) ll=mm+1;
     80                         else rr=mm;
     81                     }
     82                     int tt=ll;
     83                     ll=mid+1,rr=r;
     84                     for(;ll<rr;)
     85                     {
     86                         int mm=ll+rr>>1;
     87                         if(ha(_l,_r,mm+1,rr)==ha(L,R,mm+1,rr)) rr=mm;
     88                         else ll=mm+1;
     89                     }
     90                     int ttt=ll;
     91                     if(tt==ttt-1 || ha(_l,_r,tt+1,ttt-1)==0 && ha(L,R,tt+1,ttt-1)==0) break;
     92                     else
     93                     {
     94                         gg=1;
     95                         break;
     96                     }
     97                 }
     98             }
     99             puts((gg==1)?"NO":"YES");
    100         }
    101     }
    102     return 0;
    103 } 
  • 相关阅读:
    Shell基础一
    Hash表
    哈希表
    设置不输入密码ssh登录
    C++ int与string的转化
    mysql之数据类型
    ICE之C/S通信原理
    mysql基础入门
    SQL练习之不反复执行相同的计算
    SQL练习之求解填字游戏
  • 原文地址:https://www.cnblogs.com/wanglichao/p/7261522.html
Copyright © 2020-2023  润新知