被后缀三人组虐了一下午,写道水题愉悦身心。

题很裸,求lcq时二分下答案就行了,写的不优美会被卡时。

(写题时精神恍惚,不知不觉写了快两百行。。。竟然调都没调就A了。。。我还是继续看后缀自动机吧。。。)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define bas 131
#define p 1000000007
#define N 100005
#define ll long long
using namespace std;
char c[];
int n;
int cnt,root;
int ch[N][],fa[N],size[N];
ll pow[N],k[N];
ll zi[N];
ll sum[N];
void push_up(int x)
{
size[x]=size[ch[x][]]+size[ch[x][]]+;
k[x]=k[ch[x][]]+zi[x]*pow[size[ch[x][]]]+k[ch[x][]]*pow[size[ch[x][]]+];
k[x]%=p;
}
void rotate(int pp)
{
int q=fa[pp],y=fa[q],x=(ch[q][]==pp);
ch[q][x]=ch[pp][x^];fa[ch[q][x]]=q;
ch[pp][x^]=q;fa[q]=pp;
fa[pp]=y;
if(y)
{
if(ch[y][]==q)ch[y][]=pp;
else ch[y][]=pp;
}
push_up(q);
}
void splay(int x)
{
for(int y;y=fa[x];rotate(x))
{
if(fa[y])
{
if((ch[fa[y]][]==y&&ch[y][]==x)||(ch[fa[y]][]==y&&ch[y][]==x))rotate(y);
else rotate(x);
}
}
push_up(x);
root=x;
}
int find(int x,int kk)
{
if(size[ch[x][]]+==kk)return x;
if(size[ch[x][]]+>=kk)return find(ch[x][],kk);
return find(ch[x][],kk-size[ch[x][]]-);
}
ll pp(int x,int l)
{
int r=l+x-;
if(l!=)
{
int y=find(root,l-);
splay(y);
if(r==size[root])
{
return k[ch[y][]];
}
else
{
fa[ch[y][]]=;
int z=find(root,r+);
splay(z);
fa[z]=y;root=y;ch[y][]=z;
return k[ch[z][]];
}
}
else
{
if(r==size[root])return k[root];
splay(find(root,r+));
return k[ch[root][]];
}
}
bool pan(int x,int l,int r)
{
if(!x)return ;
ll t1=pp(x,l),t2=pp(x,r);
if(t1==t2)return ;
return ;
}
int main()
{
scanf("%s",c);
n=strlen(c);pow[]=;
for(int i=;i<=;i++)pow[i]=(pow[i-]*bas)%p;
for(int i=;i<n;i++)
{
sum[i+]=sum[i]*bas+c[i]-'a'+;
sum[i+]%=p;
}
root=;cnt=;k[]=sum[n];size[]=n;zi[]=c[n-]-'a'+;
for(int i=n-;i>=;i--)
{
cnt++;fa[cnt]=cnt-;
ch[cnt-][]=cnt;
k[cnt]=sum[i];
size[cnt]=i;
zi[cnt]=c[i-]-'a'+;
}
splay(cnt);
int m;
scanf("%d",&m);
char t[];int t1,t2;
while(m--)
{
scanf("%s",t);
if(t[]=='I')
{
scanf("%d",&t1);scanf("%s",t);
if(t1!=)
{
int y=find(root,t1);
splay(y);
if(ch[y][]!=)
{
int tmp=ch[y][];
while(ch[tmp][])tmp=ch[tmp][];
fa[ch[y][]]=;
splay(tmp);
root=y;
ch[y][]=tmp;
fa[tmp]=y;
ch[tmp][]=++cnt;
fa[cnt]=tmp;
k[cnt]=t[]-'a'+;
zi[cnt]=t[]-'a'+;
size[cnt]=;
push_up(tmp);
}
else
{
ch[y][]=++cnt;
fa[cnt]=y;
k[cnt]=t[]-'a'+;
zi[cnt]=t[]-'a'+;
size[cnt]=;
}
push_up(y);
}
else
{
int y=find(root,);
splay(y);
ch[y][]=++cnt;
fa[cnt]=y;
k[cnt]=t[]-'a'+;
zi[cnt]=t[]-'a'+;
size[cnt]=;
push_up(y);
}
}
else if(t[]=='Q')
{
scanf("%d%d",&t1,&t2);if(t1>t2)swap(t1,t2);
int l=;int r=size[root]-t2+;
while(l<=r)
{
int mid=(l+r)>>;
if(pan(mid,t1,t2))l=mid+;
else r=mid-;
}
printf("%d\n",r);
}
else
{
scanf("%d",&t1);scanf("%s",t);
int y=find(root,t1);
splay(y);
k[y]-=zi[y]*pow[size[ch[y][]]];
k[y]+=(t[]-'a'+)*pow[size[ch[y][]]];
k[y]=((k[y]%p)+p)%p;
zi[y]=t[]-'a'+;
}
}
return ;
}

bzoj 1014 splay维护hash值的更多相关文章

  1. BZOJ1014[JSOI2008]火星人prefix(splay维护hash)

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

  2. MemSQL Start[c]UP 2.0 - Round 1 F - Permutation 思维+线段树维护hash值

    F - Permutation 思路:对于当前的值x, 只需要知道x + k, x - k这两个值是否出现在其左右两侧,又因为每个值只有一个, 所以可以转换成,x+k, x-k在到x所在位置的时候是否 ...

  3. 【BZOJ2124】等差子序列 树状数组维护hash值

    [BZOJ2124]等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N ...

  4. BZOJ 3729 splay维护DFS序+博弈论

    思路: 这像是 阶梯Nim之类的东西 我们 直接把sg函数 设成mod(L+1)的 一棵子树 向下的奇数层上的石子xor起来 就是答案 有加点和改值的操作 就splay维护一下 //By Sirius ...

  5. BZOJ 1251 Splay维护序列

    思路: splay维护序列的裸题 啊woc调了一天 感谢yzy大佬的模板-- //By SiriusRen #include <cstdio> #include <cstring&g ...

  6. BZOJ 2124 线段树维护hash值

    思路: http://blog.csdn.net/wzq_QwQ/article/details/47152909 (代码也是抄的他的) 自己写得垃圾线段树怎么都过不了 隔了两个月 再写 再挂 又隔了 ...

  7. bzoj 1014 LCP 二分 Hash 匹配

    求同一字符串的两个后缀的最长公共前缀. 将字符串按位置放到Splay中维护(每个节点还维护一下该子树的hash),然后二分前缀的长度,用splay计算出指定范围的hash,按hash是否相等来判断是否 ...

  8. bzoj 1014 splay

    首先我们可以用splay来维护这个字符串,那么对于某两个位置的lcp,维护每个节点的子树的hash,然后二分判断就好了. /************************************** ...

  9. BZOJ 3323 splay维护序列

    就第三个操作比较新颖 转化成 在l前插一个点 把r和r+1合并 //By SiriusRen #include <cstdio> #include <cstring> #inc ...

随机推荐

  1. RMAN异机还原遭遇ORA-19698错误案例

    实验环境:               操作系统    :Oracle Linux Server release 5.7 64 bit               数据库版本:Oracle Datab ...

  2. Linux挂载卸载光盘&实践

    在Linux下有时候需要挂载光盘,拷贝文件或安装系统,例如拷贝Redhat操作系统镜像文件等.下面介绍一下在Linux系统下挂载.卸载光盘的方法. 在Linux系统中,每一个物理设备都可以看做是一个文 ...

  3. PHP笔记(PHP初级篇)

    学习完HTML和CSS后,终于要开始学习PHP啦!前面的铺垫只为后路的畅顺! PHP环境搭建: 企业中常用到的环境是:Linux+Apache+MySQL+PHP 学习环境是:Windows+Apac ...

  4. iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”(转)

    症状 iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装.第一次启动的时候,app 首屏一片空白,完全没数据.kill 掉重新打开就好了. 一开始以为是用户网络情况不好,但随着越来越多的用 ...

  5. [嵌入式开发]Linux性能分析——上下文切换

    一.从一个问题说起 相信很多人在玩手机还是PC时,都曾碰到过这样一种情况,安装的软件多了系统性能就变慢了,但是去查看CPU利用率一直都低于10%,内存也很充足.我在近期的开发工作中就碰到了类似的情况, ...

  6. Centos7中所有的关机命令的奇怪现象

    今天在研究shutdown,reboot,halt,poweroff几种关机命令的区别是发现他们都是/bin/systemctl的软连接 ls -l /sbin/{shutdown,reboot,ha ...

  7. Node.js 命令行程序开发教程

    nodejs开发命令行程序非常方便,具体操作方式查看下面几篇文章 http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html ...

  8. Apple Watch的课表应用iOS源码项目

    源码Class-Timetable,小清新风格的课表应用,可以按周或按天显示课表.按天显示时,左右滑动屏幕可以查看前一天或后一天的课表.功能:可以双模式切换(按天显示,按周显示,可以和 Apple W ...

  9. 【小白的CFD之旅】12 敲门实例【续2】

    接上文[小白的CFD之旅]敲门实例[续] 主要内容 3 Solution3.1 Solution Methods3.2 Solution Controls3.3 Monitors3.4 Report ...

  10. 【转载】Web移动端Fixed布局的解决方案

    特别声明:本文转载于EFE的<Web移动端Fixed布局的解决方案>.如需转载,烦请注明原文出处:http://efe.baidu.com/blog/mobile-fixed-layout ...