BZOJ4768: 2555加强版之wxh loves substring
很显然的后缀平衡树
一开始以为要可持久化 发现根本不用。。
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相关推荐
- bzoj4768: wxh loves substring //后缀平衡树
bzoj4768: 2555加强版之wxh loves substring 题意 给出一个字符串,要求资瓷: 在末尾添加/删除字符: 询问一个串的出现次数. 原串长与变化长度之和<=800000 ...
- 如何向数据库添加时同时返回ID
我们在做项目开发时很多时候都需要数据库的增删改查,而添加数据后又想得到该项数据在数据库中的主键值,这里有一个非常方便的方法可以在插入数据的同时获得主键值. public void save(Perso ...
- javaWeb实现聊天室(私聊+群聊)
写在前面 近几天,迎来了第一个小项目,不做不知道,一做吓一跳.好多知识都掌握的不够扎实,看似会了,但其实似懂非懂,不能真正掌握原理,导致使用起来错误百出.而且深深体会到,知识只有到用时方恨少,一个简单 ...
- BZOJ 2555: SubString [后缀自动机 LCT]
2555: SubString Time Limit: 30 Sec Memory Limit: 512 MB Submit: 2045 Solved: 583 [Submit][Status][ ...
- [BZOJ 2555] SubString
Substring 题意 题面 给定一个初始字符串, 要求支持在这个字符串后添加字符串/查询某个字符串作为子串的出现次数. 强制在线. 长度 \(\le600000\),询问次数 \(\le10000 ...
- [bzoj 2555]Substring
传送门 Description 给你一个字符串\(init\),要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线 ...
- BZOJ.2555.SubString(后缀自动机 LCT)
题目链接 \(Description\) 给你一个字符串init,要求支持两个操作: (1)在当前字符串的后面插入一个字符串s (2)询问字符串s在当前字符串中出现了几次(作为连续子串) 强制在线. ...
- SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】
SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...
- 2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)
题目链接:点击查看 题目大意:给出两棵以点 111 为根节点的有根树,现在要求满足条件的最大集合: 在第一棵树中,集合内的任意两个点都必须满足祖先关系,即 uuu 是 vvv 的祖先或 vvv 是 u ...
最新文章
- QQ交流群,欢迎有兴趣的同学加入。
- 自用Java爬虫工具JAVA-CURL已开源
- Leet Code之Number of 1 bits
- 优化函数html代码,CSS代码优化方法
- 谈谈2018年区块链大事件
- 线程的3种实现方式并深入源码简单分析实现原理
- 笨办法学 Python · 续 练习 9:`sed`
- 【Nexus3】使用-Nexus3批量上传jar包 artifact upload
- windows 找不到本地配置文件用临时配置文件让您登录
- USB(UVC协议)摄像头
- 上位机plc编程入门_零基础自学plc编程怎么入门?
- Java面向对象 - String类
- 基于uni-app的模板,支持h5,小程序,安卓,ios,request请求封装,全局路由拦截,也可作为项目基础模板使用
- 百度关键词地区排名查询php源码,百度关键词地区排名查询
- nodeclub迁移至nodebb
- 史上最全的javascript知识点总结,浅显易懂。
- 原生m1/m2 Sketch v90 for Mac最新中文版Sketch已更新,已解决闪退打不开问题
- BLAM源码解析(四)—— 基于ICP的位姿更新
- 大学生应该常去的网站
- 在html代码中加广告