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

题很裸,求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. Linux如何查找大文件或目录总结

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  2. Solr图形化界面banana:除Hue之外的选择

    最近Hue+Solr 方案原型验证有了一些进展.正好也收到了Google的大数据专家Sam的来件询问进展,我答复如下: Sam, 你好. 已经把Kafka+flume+solr的实时索引搭建起来了, ...

  3. freeradius + oracle 无限认证

    Radius安装配置维护文档 一.下载软件包 freeradius-server-3.0.9.tar.gz和talloc-2.1.3.tar.gz 二.配置/root目录下的.bash_profile ...

  4. jQuery 3.0 的 Data 浅析

    jQuery 3.0 在6月9日正式发布了,3.0 也被称为下一代的 jQuery .这个版本从14年10月开始,其中发布过一次beta 版(2016/1/14,)和候选版(2016/05/20).一 ...

  5. ANDROID STDUIO 项目里的R文件突然丢失的解决办法N种之一

    刚刚项目里的R文件突然挂了,清理项目,关闭重开Studio,都不能解决.快没折了. 然后只好在项目上右击,看看有没有解决的办法.发现有个 Make Module ,姑且试试吧. 结果,竟然修复了.这是 ...

  6. windows 2012 r2下安装sharepoint 2013错误解决

    日前,我在安装sharepoint 2013时,需要预部署一些软件,我们知道运行产品准备工具“prerequisiteinstaller”后就可以自动下载安装配置这些软件,但是使用系统为windows ...

  7. UNIX文件的权限之“设置用户ID位”

    用stat函数可以获取一个文件的状态信息,原型是这样的: int stat(const char *path, struct stat *buf); 其中结构体stat的结构: struct stat ...

  8. 按日子来干活——第一个Blog Day&Happy Day

    今天(周一)看到一位同仁的生活规划,感觉挺适合我,实践一下,就theo&tools day+code day+blog day,间歇性有happy day嘛~ blog day这样做,一篇bl ...

  9. Jekyll + Github 搭建属于你的静态博客

    1. 搭建Jekyll环境 linux下jekyll的安装非常简单,这里主要讲一下windows下的jekyll的安装过程 这是一台刚刚装完系统的win10系统,它什么都没有,让我们从零开始. 1.1 ...

  10. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...