...强迫症终于A了这道题  bzoj前30道全A指日可待

splay维护这个结点控制的字符串的hash值

每次旋转重新算一遍就可以了

查询的时候跑一个二分

讲起来很简单但是还是调了1h才调对了splay

把main写完饺子都凉了

没写过几次平衡树 常数写的奇大 能递归的我都递归了。。。

字符串哈希因为过于Naive只会用自然溢出。。。

但是1A了

家里的电脑有写好的read和write

我竟然忘了。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<stack>
#define ll unsigned long long
#define pi 3.14
#define eps 1e-9
#define inf 2147483233
#define m(a) memset(a,0,sizeof(a))
#define M(a) memset(a,127,sizeof(a))
#define REP(i,m,n) for(int i=1;i<=n;i++)
#define DWN(i,n,m) for(int i=n;i>=1;i++)
#define lowbit(x) x&(-x)
using namespace std;
int n;
inline int read()
{
int x=,f=;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=*x+ch-'';ch=getchar();}
return x*f;
}
inline void write(int x)
{
int num=;
char buf[];
while(x)buf[++num]=(x%)+'',x/=;
while(num)putchar(buf[num--]);
putchar('\n');
}
ll powe[];
void makepow()
{
int i;
for(powe[]=,i=;i<;i++)powe[i]=powe[i-]*;
}
const int maxn=;
char str[maxn];
struct SplayTree
{
int rt,Size;
int son[maxn][],f[maxn],size[maxn];
ll val[maxn],hsh[maxn];
char s[maxn];
inline void pushup(int x){size[x]=size[son[x][]]+size[son[x][]]+;hsh[x]=hsh[son[x][]]+powe[size[son[x][]]]*s[x]+powe[size[son[x][]]+]*hsh[son[x][]];}
inline void Rotate(int x,int type)
{
int y=f[x];
son[y][!type]=son[x][type];
f[son[x][type]]=y;
f[x]=f[y];
if(f[x])son[f[y]][son[f[y]][]==y]=x;
son[x][type]=y;
f[y]=x;
size[x]=size[y],hsh[x]=hsh[y];
pushup(y);
}
inline void splay(int x,int goal)
{
while(f[x]!=goal)
{
if(f[f[x]]==goal)
{
if(son[f[x]][]==x)Rotate(x,);
else Rotate(x,);
}
else
{
int y=f[x],z=f[y];
if(son[z][]==y)
{
if(son[y][]==x)Rotate(y,),Rotate(x,);
else Rotate(x,),Rotate(x,);
}
else
{
if(son[y][]==x)Rotate(y,),Rotate(x,);
else Rotate(x,),Rotate(x,);
}
}
}
if(goal==) rt=x;
}
inline int rank(int x,int k)
{
if(k<=size[son[x][]]) return rank(son[x][],k);
else if(k==size[son[x][]]+) return x;
else return rank(son[x][],k-size[son[x][]]-);
}
inline int build(int l,int r,int id)
{
if(l>r)return ;
int x=++Size,mid=(l+r)>>;
f[x]=id;
s[x]=str[mid];
son[x][]=build(l,mid-,x);
son[x][]=build(mid+,r,x);
pushup(x);
return x;
}
inline void insert(int k,char val)
{
int x=rank(rt,k),y=rank(rt,k+);
splay(x,),splay(y,x);
s[++Size]=val;
f[Size]=y,son[y][]=Size;
pushup(Size);
pushup(y);
pushup(x);
}
inline void change(int k,int val)
{
int x=rank(rt,k);
splay(x,);
s[x]=val;
pushup(x);
}
inline int bisearch(int kx,int ky)
{
int l=,r=n,mid;
while(l<=r)
{
mid=l+r>>;
if(ky+mid>n+)
{
r=mid-;
continue;
}
int x=rank(rt,kx-),y=rank(rt,kx+mid);
splay(x,),splay(y,x);
ll temp=hsh[son[y][]];
x=rank(rt,ky-),y=rank(rt,ky+mid);
splay(x,),splay(y,x);
if(temp==hsh[son[y][]])l=mid+;
else r=mid-;
}
return r;
}
}splay;
int main()
{
int m,i,j,k,x,y;
char op[],val[];
scanf("%s%d",str+,&m);
makepow();
n=strlen(str+);
splay.rt=splay.build(,n+,);
for(i=;i<=m;i++)
{
scanf("%s",op);
if(op[]=='I')
{
scanf("%d%s",&x,val);
splay.insert(x+,val[]);
n++;
}
else if(op[]=='R')
{
scanf("%d%s",&x,val);
splay.change(x+,val[]);
}
else
{
scanf("%d%d",&x,&y);
if(x>y) swap(x,y);
if(x!=y)
printf("%d\n",splay.bisearch(x+,y+));
else
printf("%d\n",n-x+);
}
}
return ;
}

bzoj1014火星人的更多相关文章

  1. 无旋Treap - BZOJ1014火星人 & 可持久化版文艺平衡树

    !前置技能&概念! 二叉搜索树 一棵二叉树,对于任意子树,满足左子树中的任意节点对应元素小于根的对应元素,右子树中的任意节点对应元素大于根对应元素.换言之,就是满足中序遍历为依次访问节点对应元 ...

  2. BZOJ1014火星人prefix Splay維護序列 + 字符串哈希

    @[Splay, 哈希] Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:\(madamimadam\), 我们将这个字符串的各个字符予以标号 ...

  3. BZOJ1014 火星人的prefix

    火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 11 字 ...

  4. bzoj1014 火星人 (hash+splay+二分答案)

    求公共前缀的问题可以用hash+二分来解决,但这个是动态的,所以我们用平衡树来维护区间的hash值 复杂度$O(mlog^2n)$ #include<bits/stdc++.h> #def ...

  5. bzoj1000~1025

    以后还是这样 25道题一起发 看着爽 noip失利之后发粪涂墙 刷了一波bzoj 题解: bzoj1000 A+B问题 这题不同的人有不同的写法,我写了个线段树套Treap,应该还是挺简单的 但是看别 ...

  6. [BZOJ1014][JSOI2008]火星人prefix

    [BZOJ1014][JSOI2008]火星人prefix 试题描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字 ...

  7. 【BZOJ1014】火星人(Splay,哈希)

    [BZOJ1014]火星人(Splay,哈希) 题面 BZOJ 题解 要动态维护这个串,一脸的平衡树. 那么用\(Splay\)维护这个哈希值就好了. 每次计算答案的时候二分+Splay计算区间哈希值 ...

  8. BZOJ1014 JSOI2008 火星人prefix 【非旋转Treap】*

    BZOJ1014 JSOI2008 火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符 ...

  9. 【bzoj1014】: [JSOI2008]火星人prefix 平衡树-字符串-hash-二分

    [bzoj1014]: [JSOI2008]火星人 用平衡树维护字符串的hash 然后询问的时候二分一下就好了 /* http://www.cnblogs.com/karl07/ */ #includ ...

随机推荐

  1. 自己定义Application的未捕获异常处理

    近期由于工作原因.进行Android应用开发时发现应用在出现类似空指针等异常时,抛出未被捕获的异常.Android系统有默认的未捕获异常处理器,默认行为是结束对应的线程,但并不会直接退出程序,并且在应 ...

  2. scp命令需要指定端口时要紧跟在scp后

      问题来源:我本地是Ubuntu操作系统,有时需要更新一些文件到服务器.但是,为了安全起见我们都是将服务器的sshd端口修改的,通常不使用默认的22号端口. 如果我们使用scp命令时:scp upl ...

  3. fiddler 清除证书+重新添加证书

    1. 清除证书 ①任意浏览器,打开Internet属性弹窗,点击内容页签下<证书> ②删除个人页签下,颁发者为DO_NOT_TRUST_Fiddler**的数据 2. 重新认证证书 ①打开 ...

  4. 【BZOJ3510】首都 LCT维护子树信息+启发式合并

    [BZOJ3510]首都 Description 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打 ...

  5. Java程序发送邮件

    之前上网有看到过别人总结的使用java程序发送邮件,于是自己下来练习,把自己学习的一些心得总结出来. 首先我们这里需要采用两个jar包: 需要的朋友可以自行上网去CSDN类似的网站上面找 顺便把自己测 ...

  6. 九度OJ 1334:占座位 (模拟)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:864 解决:202 题目描述: sun所在学校的教室座位每天都是可以预占的. 一个人可以去占多个座位,而且一定是要连续的座位,如果占不到他所 ...

  7. html5plus (H5 WebApp)

    是什么? 它是增强版的手机浏览器引擎, 让HTML5达到原生水平, 它提供WebApp的规范. 它结合MUI(前端框架) + HBuilder(开发工具) 即可迅速实现开发一个app. 快速起步? 1 ...

  8. PAT 1058. 选择题(20)

    批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多. 输入格式: 输入在第一行给出两个正整数N(<=1000)和M(<=100),分别是学生人数和多 ...

  9. Android动画效果animation

    1.Tween 根据指定动画开始和结束时的对象属性(位置.Alpha值(透明度).大小.角度等)以及动画播放的时间长度生成动画: 2.Frame 指定每一帧所播放的图片和时间长度.   建立动画的方法 ...

  10. shell基础part2

    shell基础 一.bash中的变量 1.变量的定义:变量是计算机的内存单元,其中存放的值是可以改变的. 2.变量的设定规则:变量名不能以数字开头:变量的等号两边不能有空格,变量的值如果想有空格必须用 ...