BZOJ1014: [JSOI2008]火星人prefix

BZOJ1014: [JSOI2008]火星人prefix

Description

  火星人最近研究了一种操作:求一个字串两个后缀的公共前缀。

比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:

序号: 1 2 3 4 5 6 7 8 9 10 11

字符: m a d a m i m a d  a  m

现在,火星人定义了一个函数LCQ(x, y),表示:该字符串中第x个字符开始的字串,与该字符串中第y个字符开始的字串,两个字串的公共前缀的长度。

比方说,LCQ(1, 7) = 5, LCQ(2, 10) = 1, LCQ(4, 7) = 0

在研究LCQ函数的过程中,火星人发现了这样的一个关联:

如果把该字符串的所有后缀排好序,就可以很快地求出LCQ函数的值;同样,如果求出了LCQ函数的值,也可以很快地将该字符串的后缀排好序。

尽管火星人聪明地找到了求取LCQ函数的快速算法,但不甘心认输的地球人又给火星人出了个难题:

在求取LCQ函数的同时,还可以改变字符串本身。

具体地说,可以更改字符串中某一个字符的值,也可以在字符串中的某一个位置插入一个字符。

地球人想考验一下,在如此复杂的问题中,火星人是否还能够做到很快地求取LCQ函数的值。

Input

第一行给出初始的字符串。

第二行是一个非负整数M,表示操作的个数。

接下来的M行,每行描述一个操作。

操作有3种,如下所示:
1、询问。语法:Q x y,x,y均为正整数。功能:计算LCQ(x,y)限制:1<=x,y<=当前字符串长度。
2、修改。语法:R x d,x是正整数,d是字符。功能:将字符串中第x个数修改为字符d。限制:x不超过当前字符串长度。
3、插入:语法:I x d,x是非负整数,d是字符。功能:在字符串第x个字符之后插入字符d,如果x=0,则在字符串开头插入。限制:x不超过当前字符串长度

Output

对于输入文件中每一个询问操作,你都应该输出对应的答案。一个答案一行。

Sample Input

madamimadam
7
Q 1 7
Q 4 8
Q 10 11
R 3 a
Q 1 7
I 10 a
Q 2 11

Sample Output

5
1
0
2
1

HINT

1、所有字符串自始至终都只有小写字母构成。

2、M<=150,000

3、字符串长度L自始至终都满足L<=100,000

4、询问操作的个数不超过10,000个。

对于第1,2个数据,字符串长度自始至终都不超过1,000

对于第3,4,5个数据,没有插入操作。

题解Here!

这个题,难到掉牙了。。。

看到字符串处理,坑能会想到 AC自动机/ SA / SAM 等等。

但是看到有插入与修改操作, Splay 啊!

然后维护一个 hash 值:

a[rt].hash=a[lson].hash*val[a[rson].s+1]+val[a[rson].s]*(a[rt].v-'a'+1)+a[rson].hash;
//lson是rt的左孩子,rson是rt的右孩子
//a[rt].v表示rt节点存的字母
//a[rt].s表示rt节点的子树大小
//val[i]表示第i位的hash值,即27^i

剩下的就是 Splay 基本操作,具体可见BZOJ1500: [NOI2005]维修数列

附代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define MAXN 100010
using namespace std;
int n,m;
int root=0,size=1;
char ch[MAXN];
unsigned val[MAXN];
struct Splay{int f,s,son[2];char v;unsigned hash;
}a[MAXN];
inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;
}
inline void pushup(int rt){if(!rt)return;int lson=a[rt].son[0],rson=a[rt].son[1];a[rt].s=a[lson].s+a[rson].s+1;a[rt].hash=a[lson].hash*val[a[rson].s+1]+val[a[rson].s]*(a[rt].v-'a'+1)+a[rson].hash;
}
inline void turn(int rt,int k){int x=a[rt].f,y=a[x].f;a[x].son[k^1]=a[rt].son[k];if(a[rt].son[k])a[a[rt].son[k]].f=x;a[rt].f=y;if(y)a[y].son[a[y].son[1]==x]=rt;a[x].f=rt;a[rt].son[k]=x;pushup(x);pushup(rt);
}
void splay(int rt,int ancestry){while(a[rt].f!=ancestry){int x=a[rt].f,y=a[x].f;if(y==ancestry)turn(rt,a[x].son[0]==rt);else{int k=a[y].son[0]==x?1:0;if(a[x].son[k]==rt){turn(rt,k^1);turn(rt,k);}else{turn(x,k);turn(rt,k);}}}if(ancestry==0)root=rt;
}
inline int newnode(char x){int rt=size++;a[rt].v=x;a[rt].hash=x-'a'+1;a[rt].s=1;a[rt].son[0]=a[rt].son[1]=0;return rt;
}
int buildtree(int l,int r){if(l>r)return 0;int mid=l+r>>1,lson=0,rson=0;lson=buildtree(l,mid-1);int rt=newnode(ch[mid]);rson=buildtree(mid+1,r);a[rt].son[0]=lson;a[rt].son[1]=rson;if(lson)a[lson].f=rt;if(rson)a[rson].f=rt;pushup(rt);return rt;
}
int kth(int rt,int k){while(1){int y=a[rt].son[0];if(k>a[y].s+1){k-=a[y].s+1;rt=a[rt].son[1];}else if(k<=a[y].s)rt=y;else return rt;}
}
inline int split(int l,int r){int front=kth(root,l),next=kth(root,r);splay(front,0);splay(next,front);return a[next].son[0];
}
inline void change(int x,char y){int front=kth(root,x),next=kth(root,x+2);splay(front,0);splay(next,front);int u=a[next].son[0];a[u].v=y;a[u].hash=y-'a'+1;pushup(next);pushup(front);
}
inline void insert(int x,char y){int front=kth(root,x),next=kth(root,x+1);splay(front,0);splay(next,front);int rt=newnode(y);a[next].son[0]=rt;a[rt].f=next;pushup(next);pushup(front);
}
inline bool check(int x,int y,int len){int u=split(x,x+len+1),hu=a[u].hash;int v=split(y,y+len+1),hv=a[v].hash;return (hu==hv);
}
void work(){char f[2],y[2];int x,k;while(m--){scanf("%s",f);x=read();if(f[0]=='Q'){k=read();int l=1,r=min(size-x,size-k)-2,mid;while(l<=r){mid=l+r>>1;if(check(x,k,mid))l=mid+1;else r=mid-1;}printf("%d\n",r);}if(f[0]=='R'){scanf("%s",y);change(x,y[0]);}if(f[0]=='I'){scanf("%s",y);insert(x+1,y[0]);}}
}
void init(){scanf("%s",ch+1);n=strlen(ch+1);val[0]=1;for(int i=1;i<=MAXN-5;i++)val[i]=val[i-1]*27;root=buildtree(0,n+1);m=read();
}
int main(){init();work();return 0;
}

 

转载于:https://www.cnblogs.com/Yangrui-Blog/p/9343817.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis将散裂中某个值自增_这些Redis命令你都掌握了没?

本章主要内容字符串命令、列表命令和集合命令散列命令和有序集合命令发布命令与订阅命令其他命令本章将介绍一些没有在第1章和第2章出现过的Redis命令&#xff0c;学习这些命令有助于读者在已有示例的基础上构建更为复杂的程序&#xff0c;并学会如何更好地去解决自己遇到的问题…

asp.net的MessageBox

public class MessageBox{ public enum MsgButton { /// <summary> /// 只是OK按钮 /// </summary> OK 1, /// <summary> /// 提示是否确定 /// </summary> OKCancel 2 } publ…

深入理解激活函数

为什么需要非线性激活函数&#xff1f; 说起神经网络肯定会降到神经函数&#xff0c;看了很多资料&#xff0c;也许你对激活函数这个名词会感觉很困惑&#xff0c; 它为什么叫激活函数&#xff1f;它有什么作用呢&#xff1f; 看了很多书籍上的讲解说会让神经网络变成很丰富的…

如何一键部署项目、代码自动更新

为什么80%的码农都做不了架构师&#xff1f;>>> 摘要&#xff1a;my-deploy:由nodejs写的一个自动更新工具,理论支持所有语言(php、java、c#)的项目,支持所有git仓库(bitbucket、github等)。github效果如何?如果你的后端项目放在github、bitbucket等git仓库中管理…

Kettle7.1在window启动报错

实验环境&#xff1a; window10 x64 kettle7.1 pdi-ce-7.1.0.0-12.zip 错误现象&#xff1a; a java exception has occurred 问题解决&#xff1a; 运行调试工具 data-integration\SpoonDebug.bat //调试错误的&#xff0c;根据错误明确知道为何启动不了&#xff0c;Y--Y-…

opa847方波放大电路_电子管放大电路当中阴极电阻的作用和选择

胆机制作知识视频&#xff1a;6P14单端胆机用示波器方波测试输出波形详细步骤演示完整版自制胆机试听视频&#xff1a;胆机播放《猛士的士高》经典舞曲 熟悉的旋律震撼的效果首先看下面这一张300B电子管电路图&#xff1a;300B单端胆机原理图图纸里面画圆圈的电阻就是放大电路当…

键盘钩子

C#键盘钩子//*************************键盘钩子********************** //定义变量 public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); static int hKeyboardHook 0; HookProc KeyboardHookProcedure; /************************* * 声明API函数 * ***…

matplotlib基础函数函数 plot, figure

matplotlib.pyplot.plot(*args, scalexTrue, scaleyTrue,dataNone,**kwargs) 用线段和标记去绘制x和y。调用签名&#xff1a; plot([x], y, [fmt], *, dataNone, **kwargs) plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)点或线的坐标由x, y给出 操作参数 fmt 是为了…

清洁数据ploy n_清洁屋数据

清洁数据ploy nAs a bootcamp project, I was asked to analyze data about the sale prices of houses in King County, Washington, in 2014 and 2015. The dataset is well known to students of data science because it lends itself to linear regression modeling. You …

redis安装redis集群

NoSql数据库之Redis1、什么是nosql&#xff0c;nosql的应用场景2、Nonsql数据库的类型a) Key-valueb) 文档型&#xff08;类似于json&#xff09;c) 列式存储d) 图式3、redis的相关概念kv型的。4、Redis的安装及部署5、Redis的使用方法及数据类型a) Redis启动及关闭b) Redis的数…

联想拯救者y7000p加内存条_内存、硬盘不够用?手把手教你升级联想拯救者Y7000P...

由于这两年内存价格的高企&#xff0c;主流笔记本的内存容量被锁定在 8GB 已经有了相当长的时间。作为近几个月最热门的游戏本产品&#xff0c;联想拯救者 Y7000P 除顶配之外同样使用的是 8GB 内存和 512GB 固态硬盘的配置。所以买到这款机器的玩家多数都会选择进行内存和硬盘的…

机器学习实践一 logistic regression regularize

Logistic regression 数据内容&#xff1a; 两个参数 x1 x2 y值 0 或 1 Potting def read_file(file):data pd.read_csv(file, names[exam1, exam2, admitted])data np.array(data)return datadef plot_data(X, y):plt.figure(figsize(6, 4), dpi150)X1 X[y 1, :]X2 X[…

ajax+webservice

版本为AJAX November CTP 三个示例分别为&#xff1a;1 带参数的WS方法2 不带参数的WS方法3 参数类型为DataTable的WS方法 一、WebMethod注意要点&#xff1a;1 WebMethod类需要添加命名空间 Microsoft.Web.Script.Services&#xff0c;此空间需要引用Microsoft.Web.Preview.dl…

深度学习数据扩张_适用于少量数据的深度学习结构

作者&#xff1a;Gorkem Polat编译&#xff1a;ronghuaiyang导读一些最常用的few shot learning的方案介绍及对比。传统的CNNs (AlexNet, VGG, GoogLeNet, ResNet, DenseNet…)在数据集中每个类样本数量较多的情况下表现良好。不幸的是&#xff0c;当你拥有一个小数据集时&…

时间管理

时间管理 时间管理是运用策略和技术&#xff0c;帮助你尽可能有效地利用你的时间。 不仅仅是要将时间用在正确的地方&#xff0c; 而且还要将尽可能有效地加以利用。 目前是如何利用时间的&#xff1a; 意识是时间管理的先决条件。目标提供路线图。选择是难点。 意识 第一条…

基于边缘计算的实时绩效_基于绩效的营销中的三大错误

基于边缘计算的实时绩效We’ve gone through 20% of the 21st century. It’s safe to say digitalization isn’t a new concept anymore. Things are fully or at least mostly online, and they tend to escalate in the digital direction. That’s why it’s important to…

本线程钩子

钩子其实就是调用一下API而已&#xff1a; 1、安装钩子&#xff1a;   SetWindowsHookEx 函数原形&#xff1a;HHOOK SetWindowsHookEx( int idHook, // 钩子类型&#xff0c; HOOKPROC lpfn, // 钩子函数地址…

Maven Web项目解决跨域问题

跨域问题目前笔者所用到的方案大致有三种:jsonp,SpringMVC 4以上注解方式和cros三方过滤器。 Jsonp JSONP(JSON with Padding)是一个非官方的协议&#xff0c;它允许在服务器端集成Script tags返回至客户端&#xff0c;通过javascript callback的形式实现跨域访问&#xff08;这…

为什么Facebook的API以一个循环作为开头?

作者 | Antony Garand译者 | 无明如果你有在浏览器中查看过发给大公司 API 的请求&#xff0c;你可能会注意到&#xff0c;JSON 前面会有一些奇怪的 JavaScript&#xff1a;为什么他们会用这几个字节来让 JSON 失效&#xff1f;为了保护你的数据 如果没有这些字节&#xff0c;那…

城市轨道交通运营票务管理论文_城市轨道交通运营管理专业就业前景怎么样?中职优选告诉你...

​​城市轨道交通运营管理专业&#xff0c;专业就业前景怎么样&#xff1f;就业方向有哪些&#xff1f;有很多同学都感觉很迷忙&#xff0c;为了让更多的同学们了解城市轨道交通运营管理专业的就业前景与就业方向&#xff0c;整理出以下内容希望可以帮助同学们。城市轨道交通运…