splay维护哈希值即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define ull unsigned long long
#define N 100010
#define P 509
#define lson tree[k].ch[0]
#define rson tree[k].ch[1]
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int m,cnt,root;
ull p[N];
char s[N];
struct data{int ch[],fa,size,x;ull hash;
}tree[N];
void up(int k)
{
tree[k].size=tree[lson].size+tree[rson].size+;
tree[k].hash=tree[lson].hash*p[tree[rson].size+]+tree[k].x*p[tree[rson].size]+tree[rson].hash;
}
void build(int &k,int l,int r)
{
if (l>r) return;
int mid=l+r>>;
k=++cnt,tree[k].x=s[mid]-'a';
build(lson,l,mid-),build(rson,mid+,r);
tree[lson].fa=tree[rson].fa=k;
up(k);
}
int whichson(int k){return tree[tree[k].fa].ch[]==k;}
void move(int k)
{
int fa=tree[k].fa,gf=tree[fa].fa,p=whichson(k);
if (fa) tree[gf].ch[whichson(fa)]=k;tree[k].fa=gf;
tree[tree[k].ch[!p]].fa=fa,tree[fa].ch[p]=tree[k].ch[!p];
tree[k].ch[!p]=fa,tree[fa].fa=k;
up(fa),up(k);
}
void splay(int k,int rt)
{
while (tree[k].fa!=rt)
{
int fa=tree[k].fa;
if (tree[fa].fa!=rt)
if (whichson(k)^whichson(fa)) move(k);
else move(fa);
move(k);
}
if (!rt) root=k;
}
int find(int k,int x)
{
if (tree[lson].size+==x) return k;
if (tree[lson].size>=x) return find(lson,x);
else return find(rson,x-tree[lson].size-);
}
int split(int x,int y)
{
int p=find(root,x),q=find(root,y+);
splay(p,);
splay(q,p);
return q;
}
ull gethash(int x,int y)
{
int p=split(x,y);
return tree[tree[p].ch[]].hash;
}
void ins(int k,int x)
{
int p=split(k+,k);
k=++cnt;tree[k].fa=p,tree[p].ch[]=k,tree[k].x=x;
up(k),up(p),up(root);
}
void modify(int k,int x)
{
int p=split(k,k);
tree[k=tree[p].ch[]].x=x;
up(k),up(p),up(root);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj1014.in","r",stdin);
freopen("bzoj1014.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
scanf("%s",s+);int n=strlen(s+);
p[]=;for (int i=;i<=;i++) p[i]=p[i-]*P;
build(root,,n+);
m=read();
while (m--)
{
char c=getc();
if (c=='Q')
{
int x=read(),y=read();
int l=,r=n-max(x,y)+,ans=;
while (l<=r)
{
int mid=l+r>>;
if (gethash(x,x+mid-)==gethash(y,y+mid-)) ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
}
if (c=='I')
{
n++;int x=read();char c=getc();
ins(x,c-'a');
}
if (c=='R')
{
int x=read();char c=getc();
modify(x,c-'a');
}
}
return ;
}

BZOJ1014 JSOI2008火星人(splay+哈希)的更多相关文章

  1. BZOJ1014:[JSOI2008]火星人(Splay,hash)

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

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

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

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

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

  4. 2018.06.28 BZOJ1014 [JSOI2008]火星人prefix(非旋treap+hash)

    [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Submit: 8951 Solved: 2860 Description 火星 ...

  5. bzoj千题计划106:bzoj1014 [JSOI2008]火星人prefix

    http://www.lydsy.com/JudgeOnline/problem.php?id=1014 两个后缀的最长公共前缀:二分+hash 带修改带插入:splay维护 #include< ...

  6. [bzoj1014](JSOI2008)火星人 prefix (Splay维护哈希)

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

  7. [BZOJ1014] [JSOI2008] 火星人prefix (splay & 二分答案)

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

  8. bzoj1014: [JSOI2008]火星人prefix splay+hash+二分

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

  9. bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)

    题目大意:一个字符串三个操作:①求两个后缀的LCP②插入一个字符③修改一个字符. 前几天刚学了hash+二分求lcp,就看到这题. 原来splay还能这么用?!原来splay模板这么好写?我以前写的s ...

随机推荐

  1. 由javascript的闭包引申到程序语言编译上的自由变量作用域的考量

    function foo() { var x = 10; return function bar() { console.log(x); }; } // "foo"返回的也是一个f ...

  2. easyui的datagrid的列checkbox自定义增加disabled选项

    需求根据权限判断datagrid的每一列的checkBox是否可选,看了下文档,发现editor的checkbox应该能实现这个功能,但我们项目自己将easyui外面包了一层,把原生的editor改成 ...

  3. 如何屏蔽在Skyline的TerraExplorer中加载Shape或者KML等数据时的缓冲提示信息

    在使用TerraExplorer软件或者二次开发自定义打开FLY工程时,以及在已有的FLY工程中导入其他矢量数据,如SHP.WFS图层.KML图层时,总会看到类似下图的提示信息: 有些用户问,如何能屏 ...

  4. [04] Bean的实例化和多个配置文件

    之前我们已经提到过,Spring的核心能力之一就是IOC机制,从上章的示例中我们也可以看到,Spring中的ApplicationContext充当了一个实例化对象的容器的角色,并管理着它们的生命周期 ...

  5. React-本地状态(state)

    在类组件中添加本地状态(state): 1.创建一个继承自 React.Component 类的 ES6 class 同名类: 2.添加一个 类构造函数(class constructor) 初始化 ...

  6. 安卓自动化测试,贺晓聪之uiautomator设备和选择器~Python详解

    1.设备对象 引入uiautomator,获取设备对象<所谓设备对象可理解为:Android模拟器或者真机> 语法:from uiautomator import device as d ...

  7. MariaDB 安装与启动 过程记录

    1. 安装之前的准备工作 rpm -qa |grep mysql rpm -qa |grep mariadb 按照查出来的软件包使用  yum remove  全部卸载,当然也可以 yum remov ...

  8. Apache之Rewrite和RewriteRule规则梳理以及http强转https的配置总结

    一. 简单实例介绍一般来说,apache配置好http和https后,如果想要做http强转到https,需要设置url重定向规则,大致需要下面几个步骤即可完成配置: 1)在httpd.conf文件里 ...

  9. Centos下DNS+NamedManager高可用部署方案完整记录

    之前说到了NamedManager单机版的配置,下面说下DNS+NamedManager双机高可用的配置方案: 1)机器环境 主机名 ip地址 dns01.kevin.cn 192.168.10.20 ...

  10. Spring RPC 入门学习(3)-获取Student对象

    Spring RPC传递对象. 1. 新建RPC接口:StudentInterface.java package com.cvicse.ump.rpc.interfaceDefine; import ...