bzoj1014: [JSOI2008]火星人prefix splay+hash
我写的代码好像自古以来就是bzoj不友好型的
本地跑的比std快,但是交上去巧妙被卡
答案。。。应该是对的,拍了好久了
#include <bits/stdc++.h>
#define MOD 998244353
#define mid (l+r>>1)
using namespace std;
int n,m,x,y;char ch;
long long mi[];
struct spla
{
int c[][],fa[],ch[],size[],ha[];
int rt,cnt;
void up(int now)
{
size[now]=size[c[now][]]+size[c[now][]]+;
ha[now]=(ha[c[now][]]+mi[size[c[now][]]]*ch[now]%MOD+mi[size[c[now][]]+]*ha[c[now][]]%MOD)%MOD;
}
void rot(int x,int &root)
{
int y=fa[x],k=c[y][]==x;
if(y!=root) c[fa[y]][c[fa[y]][]==y]=x;
else root=x;
fa[x]=fa[y];
fa[y]=x;
fa[c[x][!k]]=y;
c[y][k]=c[x][!k];
c[x][!k]=y;
up(y);up(x);
}
void splay(int x,int &root)
{
for(int y=fa[x];x!=root;rot(x,root),y=fa[x])
if(y!=root)
rot(((c[fa[y]][]==y)^(c[y][]==x))?x:y,root);
}
void add(int x,int y)
{
ch[++cnt]=y;size[cnt]=;ha[cnt]=y;
if(!rt)
{
rt=cnt;
return;
}
if(x==)
{
splay(fin(),rt);
c[rt][]=cnt;fa[cnt]=rt;
return;
}
splay(fin(x),rt);
if(x==n)
c[rt][]=cnt,fa[cnt]=rt;
else
splay(fin(x+),c[rt][]),c[c[rt][]][]=cnt,fa[cnt]=c[rt][];
}
/*
void add(int x,int y)
{
ch[++cnt]=y;size[cnt]=1;ha[cnt]=y;
if(!rt)
{
rt=cnt;
return;
}
int now=rt;
while(1)
{
if(x>size[c[now][0]])
if(c[now][1]) x-=size[c[now][0]]+1,now=c[now][1];
else
{
c[now][1]=cnt;fa[cnt]=now;
splay(cnt,rt);
return;
}
else
if(c[now][0]) now=c[now][0];
else
{
c[now][0]=cnt;fa[cnt]=now;
splay(cnt,rt);
return;
}
}
}*/
int fin(int x)
{
int now=rt;
while(x> || c[now][])
{
if(x==size[c[now][]]+)
break;
if(x>size[c[now][]])
x-=size[c[now][]]+,now=c[now][];
else
now=c[now][];
}
return now;
}
void change(int x,int y)
{
int now=fin(x);
splay(now,rt);
ch[now]=y;
up(now);
}
int hash(int x,int y)
{
if(x== && y==n) return ha[rt];
if(x==)
{
splay(fin(y+),rt);
return ha[c[rt][]];
}
if(y==n)
{
splay(fin(x-),rt);
return ha[c[rt][]];
}
splay(fin(x-),rt);
splay(fin(y+),c[rt][]);
return ha[c[c[rt][]][]];
}
} sp;
inline int read()
{
char ch=getchar();
for(;!isdigit(ch);ch=getchar());
int re=;
bool fl=;
if (ch=='-')
{
re=;
ch=getchar();
}
while (isdigit(ch))
{
re=re*+ch-'';
ch=getchar();
}
return fl?re:-re;
}
inline void write(int re)
{
if (re<)
{
putchar('-');
re=-re;
}
if (re>) write(re/);
putchar(re%+'');
}
void work(int x,int y)
{
if(x>y) swap(x,y);
int l=,r=n-y+;
while(l<r)
if(sp.hash(x,x+mid-)==sp.hash(y,y+mid-)) l=mid+;
else r=mid;
write(l-);puts("");
}
int main()
{
mi[]=;
for(int i=;i<=;i++)
mi[i]=mi[i-]*%MOD;
for(ch=getchar();isalpha(ch);ch=getchar())
sp.add(n,ch-'a'+),++n;
m=read();
for(int i=;i<=m;i++)
{
for(ch=getchar();!isalpha(ch);ch=getchar());
x=read();
if(ch=='Q') y=read();
else
{
char cas=ch;
for(ch=getchar();!isalpha(ch);ch=getchar());
y=ch-'a'+;
ch=cas;
}
if(i==)
int e=;
if(ch=='Q') work(x,y);
else
if(ch=='R')
sp.change(x,y);
else
sp.add(x,y),++n;
}
return ;
}
bzoj1014: [JSOI2008]火星人prefix splay+hash的更多相关文章
- bzoj1014: [JSOI2008]火星人prefix splay+hash+二分
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- 【BZOJ1014】[JSOI2008]火星人prefix Splay+hash
[BZOJ1014][JSOI2008]火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个 ...
- BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )
用splay维护序列, 二分+hash来判断LCQ.. #include<bits/stdc++.h> using namespace std; typedef unsigned long ...
- BZOJ 1014 [JSOI2008]火星人prefix (Splay + Hash + 二分)
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8112 Solved: 2569[Submit] ...
- 【bzoj1014】[JSOI2008]火星人prefix Splay+Hash+二分
题目描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 ...
- BZOJ1014[JSOI2008]火星人prefix(splay维护hash)
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- BZOJ1014: [JSOI2008]火星人prefix(splay 二分 hash)
题意 题目链接 Sol 一眼splay + 二分hash,不过区间splay怎么写来着呀 试着写了两个小时发现死活不对 看了一下yyb的代码发现自己根本就不会splay.... // luogu-ju ...
- [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 ...
随机推荐
- python-多线程1
程序\进程\线程的关系: 程序(program) 一组功能集合的静态描述,程序至少有一个进程 进程(process) 进程是系统进行资源分配和调度的,他们拥有自己独立的空间,进程至少有一个线程 线程( ...
- Linux_学习_01_ 压缩文件夹
二.参考资料 1.Linux下压缩某个文件夹命令
- ACM学习历程—HDU4956 Poor Hanamichi(模拟)
Poor Hanamichi Problem Description Hanamichi is taking part in a programming contest, and he is assi ...
- 1066 Bash 游戏
传送门 1066 Bash游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到最后1 ...
- poj3784Running Median——堆维护中间值
题目:http://poj.org/problem?id=3784 将较小的数放入大根堆,较大的数放入小根堆,控制较小数堆大小比较大数堆小1,则较大数堆堆顶即为中位数. 代码如下: #include& ...
- POCO库中文编程参考指南(11)如何使用Reactor框架?
1 Reactor 框架概述 POCO 中的 Reactor 框架是基于 Reactor 设计模式进行设计的.其中由 Handler 将某 Socket 产生的事件,发送到指定的对象的方法上,作为回调 ...
- 12 Vue学习 项目技术栈
vue2 + vuex + vue-router + webpack + ES6/7 + less + element-ui 1:vuex: Vuex 是一个专为 Vue.js 应用程序开发的状态管理 ...
- NancyFX 第二章 Rest框架
正如你看到的,Nancy有两个主要用途. 其中第一项是作为一种通用的基于 REST 框架,可替代 ASP.NET Web API 或其他Rest工具包. 默认情况下,Nancy提供一流的路由和内容协商 ...
- 转-tcp建立和释放详解
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删 ...
- phpcms换域名细节
修改/caches/configs/system.php里面所有和域名有关的,把以前的老域名修改为新域名. 进入后台设置-->站点管理,对相应的站点的域名修改为新域名. 点击后台右上角的&quo ...