很显然的后缀平衡树
一开始以为要可持久化 发现根本不用。。
treap的常数要死人啊?
我好像T光光了?
寄刀片寄刀片


#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<map>
#include<cmath>
using namespace std;
#define ld long longchar Query[999101];namespace Tree
{struct Node{int no,rank,size,Rand;long long l,r;bool cs;long long val(){return l+r;}Node *lc,*rc;}*T[700000];constint Max=300000;Node *Cache;int Cachetot;inline Node *New(){if(!Cachetot)Cache=new Node[Cachetot=Max];return Cache+(--Cachetot);}inline Node *New(int rand,int no,long long l,long long r){Node *K=New();K->cs=false;K->no=no;K->size=K->rank=1;K->Rand=rand;K->lc=K->rc=NULL;K->l=l,K->r=r;return K;}inline Node *New(Node *Old){Node *K=New();*K=*Old;return K;}char Con[700001];int Cnt;Node *Cur;void Up(Node *a){a->size=(a->rank=(a->lc?a->lc->size:0)+1)+(a->rc?a->rc->size:0);}void Bg(){Con[0]='A'-1;Cur=T[0]=New(rand(),0,-1e15,1e15);}bool cmp(Node *a,Node *b){return Con[a->no]^Con[b->no]?Con[a->no]<Con[b->no]:(T[a->no-1]->val())<(T[b->no-1]->val());}void Modify(Node *N,long long l,long long r){if(!N)return ;if((!N->cs)&&N->l==l&&N->r==r)return ;N->cs=false;N->l=l,N->r=r;Modify(N->lc,l,(l+r)/2);Modify(N->rc,(l+r)/2,r);}Node *Merge(Node *a,Node *b){if(!a)return b;if(!b)return a;Node *R;if(a->Rand>b->Rand)R=a,R->rc=Merge(R->rc,b);else R=b,R->lc=Merge(a,R->lc);R->cs=true;Up(R);return R;}void Split(Node *Cur,Node *Op,Node *&Lc,Node *&Rc){if(!Cur){Lc=Rc=NULL;return;}Cur->cs=true;if(cmp(Cur,Op)){Lc=Cur;Split(Cur->rc,Op,Lc->rc,Rc);Up(Lc);return;}Rc=Cur;Split(Cur->lc,Op,Lc,Rc->lc);Up(Rc);}void insert(char k){Con[++Cnt]=k;T[Cnt]=New(rand(),Cnt,-1,-1);Node *Lc,*Rc;Split(Cur,T[Cnt],Lc,Rc);Cur=Merge(Lc,T[Cnt]);Cur=Merge(Cur,Rc);Modify(Cur,-1e15,1e15); }Node *Del(Node *a){if(!a)return NULL;a->cs=true;if(a->lc)return a->lc=Del(a->lc),Up(a),a;return a->rc;}void pop(){Node *Lc,*Rc;Split(Cur,T[Cnt],Lc,Rc);if(Rc==NULL)Cnt++,Cnt--;Rc=Del(Rc);Cur=Merge(Lc,Rc);Modify(Cur,-1e15,1e15);Cnt--;}int rank(Node *a,int Len){if(!a)return 0;bool cp;for(int i=1;i<=Len;i++)if(Con[a->no-i+1]^Query[i]){cp=Con[a->no-i+1]<Query[i];break;}return (cp?a->rank+rank(a->rc,Len):(rank(a->lc,Len)));}int Qr(int Len){Query[++Len]='A'-2;int p=rank(Cur,Len);Query[Len]='Z'+1;p=rank(Cur,Len)-p;return p;}}
int L,mask;
inline void Decode(int l)
{int t=mask;for(int i=1;i<=l;i++){t=(t*131+i-1)%l;swap(Query[i],Query[t+1]);}for(int i=1,j=l;i<j;i++,j--)swap(Query[i],Query[j]);
}int main()
{Tree::Bg();freopen("self.in","r",stdin);freopen("self.out","w",stdout);int Q;scanf("%d",&Q);scanf("%s",Query);int Len=strlen(Query);for(int i=0;i<Len;i++)Tree::insert(Query[i]);while(Q--){char c;do c=getchar();while(c!='A'&&c!='D'&&c!='Q');if(c=='Q'){do c=getchar();while(c!=' ');int n;n=0;do c=getchar();while(c<'A'||c>'Z');while(c<='Z'&&c>='A')Query[++n]=c,c=getchar();Decode(n);L=Tree::Qr(n);mask^=L;printf("%d\n",L);}else    if(c=='A'){do c=getchar();while(c!=' ');int n;n=0;do c=getchar();while(c<'A'||c>'Z');while(c<='Z'&&c>='A')Query[++n]=c,c=getchar();Decode(n);for(int i=n;i>=1;i--)Tree::insert(Query[i]);}else{do c=getchar();while(c!=' ');int n;scanf("%d",&n);while(n--)Tree::pop();}}return 0;
}

BZOJ4768: 2555加强版之wxh loves substring相关推荐

  1. bzoj4768: wxh loves substring //后缀平衡树

    bzoj4768: 2555加强版之wxh loves substring 题意 给出一个字符串,要求资瓷: 在末尾添加/删除字符: 询问一个串的出现次数. 原串长与变化长度之和<=800000 ...

  2. 如何向数据库添加时同时返回ID

    我们在做项目开发时很多时候都需要数据库的增删改查,而添加数据后又想得到该项数据在数据库中的主键值,这里有一个非常方便的方法可以在插入数据的同时获得主键值. public void save(Perso ...

  3. javaWeb实现聊天室(私聊+群聊)

    写在前面 近几天,迎来了第一个小项目,不做不知道,一做吓一跳.好多知识都掌握的不够扎实,看似会了,但其实似懂非懂,不能真正掌握原理,导致使用起来错误百出.而且深深体会到,知识只有到用时方恨少,一个简单 ...

  4. BZOJ 2555: SubString [后缀自动机 LCT]

    2555: SubString Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 2045  Solved: 583 [Submit][Status][ ...

  5. [BZOJ 2555] SubString

    Substring 题意 题面 给定一个初始字符串, 要求支持在这个字符串后添加字符串/查询某个字符串作为子串的出现次数. 强制在线. 长度 \(\le600000\),询问次数 \(\le10000 ...

  6. [bzoj 2555]Substring

    传送门 Description 给你一个字符串\(init\),要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线 ...

  7. BZOJ.2555.SubString(后缀自动机 LCT)

    题目链接 \(Description\) 给你一个字符串init,要求支持两个操作: (1)在当前字符串的后面插入一个字符串s (2)询问字符串s在当前字符串中出现了几次(作为连续子串) 强制在线. ...

  8. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】

    SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...

  9. 2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)

    题目链接:点击查看 题目大意:给出两棵以点 111 为根节点的有根树,现在要求满足条件的最大集合: 在第一棵树中,集合内的任意两个点都必须满足祖先关系,即 uuu 是 vvv 的祖先或 vvv 是 u ...

最新文章

  1. QQ交流群,欢迎有兴趣的同学加入。
  2. 自用Java爬虫工具JAVA-CURL已开源
  3. Leet Code之Number of 1 bits
  4. 优化函数html代码,CSS代码优化方法
  5. 谈谈2018年区块链大事件
  6. 线程的3种实现方式并深入源码简单分析实现原理
  7. 笨办法学 Python · 续 练习 9:`sed`
  8. 【Nexus3】使用-Nexus3批量上传jar包 artifact upload
  9. windows 找不到本地配置文件用临时配置文件让您登录
  10. USB(UVC协议)摄像头
  11. 上位机plc编程入门_零基础自学plc编程怎么入门?
  12. Java面向对象 - String类
  13. 基于uni-app的模板,支持h5,小程序,安卓,ios,request请求封装,全局路由拦截,也可作为项目基础模板使用
  14. 百度关键词地区排名查询php源码,百度关键词地区排名查询
  15. nodeclub迁移至nodebb
  16. 史上最全的javascript知识点总结,浅显易懂。
  17. 原生m1/m2 Sketch v90 for Mac最新中文版Sketch已更新,已解决闪退打不开问题
  18. BLAM源码解析(四)—— 基于ICP的位姿更新
  19. 大学生应该常去的网站
  20. 在html代码中加广告

热门文章

  1. 看书学习感悟系列(三)
  2. ResNet DenseNet(原理篇)
  3. 基于 FCCA 的多特征融合的检索方法
  4. Windows Server 2016搭建文件服务器
  5. X书Scheme跳转到指定页面
  6. OpenGL ES之glRotate函数
  7. 【ansys常见命令集合】
  8. 远程桌面连接不上是什么原因?怎么解决
  9. Linux中的/proc文件系统详解(C/C++代码实现)
  10. sendToTarget与sendMessage