AC日记——[JSOI2008]火星人prefix bzoj 1014
思路:
平衡树+二分答案+hash;
好了懂了吧。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 2000005 int ch[maxn][],key[maxn],f[maxn],root,size[maxn];
int n,m,tot; long long ha[maxn],mi[maxn]; char ai[maxn]; inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} inline bool getson(int now)
{
return ch[f[now]][]==now;
} inline void updata(int now)
{
size[now]=,ha[now]=;
if(ch[now][]) size[now]+=size[ch[now][]],ha[now]+=ha[ch[now][]];
ha[now]+=key[now]*mi[size[now]-];
if(ch[now][]) ha[now]+=ha[ch[now][]]*mi[size[now]],size[now]+=size[ch[now][]];
} inline void rotate(int now,int &to)
{
int fa=f[now],ffa=f[fa];bool pos=getson(now);
ch[fa][pos]=ch[now][pos^];
if(ch[fa][pos]) f[ch[fa][pos]]=fa;
if(to==fa) to=now;
else ch[ffa][getson(fa)]=now;
ch[now][pos^]=fa,f[fa]=now,f[now]=ffa;
updata(fa),updata(now);
} void splay(int now,int &to)
{
while(now!=to)
{
int fa=f[now],ffa=f[fa];
if(fa!=to)
{
if(ch[fa][]==now^ch[ffa][]==fa) rotate(now,to);
else rotate(now,to);
}rotate(now,to);
}
} void find(int p,bool pos)
{
int now=root;
while()
{
if(size[ch[now][]]>=p) now=ch[now][];
else
{
p-=size[ch[now][]];
if(p==)
{
if(pos) splay(now,root);
else splay(now,ch[root][]);
return ;
}
else p--,now=ch[now][];
}
}
} void insert(int p,int ci)
{
find(p,true),find(p+,false);
ch[ch[root][]][]=++tot;
key[tot]=ci,size[tot]=,f[tot]=ch[root][],ha[tot]=ci;
updata(ch[root][]),updata(root);
} int tree_build(int l,int r,int fa)
{
int now=l+r>>;key[now]=ai[now],f[now]=fa;
if(now>l) ch[now][]=tree_build(l,now-,now);
if(now<r) ch[now][]=tree_build(now+,r,now);
updata(now);return now;
} long long hash_ci(int p,int len)
{
find(p,true),find(p+len+,false);
return ha[ch[ch[root][]][]];
} int main()
{
mi[]=;
for(int i=;i<=;i++) mi[i]=mi[i-]*27LL;
scanf("%s",ai+),tot=strlen(ai+)+;
for(int i=;i<=tot-;i++) ai[i]=ai[i]-'a'+;
root=tree_build(,tot,);
in(m);char op[];int u,v;
for(;m--;)
{
scanf("%s",op);
if(op[]=='Q')
{
in(u),in(v);
if(u>v) swap(u,v);
int l=,r=tot-v-,ans=;
while(l<=r)
{
int mid=l+r>>;
if(hash_ci(u,mid)==hash_ci(v,mid)) ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
}
else if(op[]=='R')
{
in(u),scanf("%s",op);
find(u+,true),key[root]=op[]-'a'+,updata(root);
}
else
{
in(u),scanf("%s",op);
insert(u+,(int)(op[]-'a'+));
}
}
return ;
}
AC日记——[JSOI2008]火星人prefix bzoj 1014的更多相关文章
- 1014: [JSOI2008]火星人prefix - BZOJ
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6243 Solved: 2007[Submit] ...
- BZOJ 1014: [JSOI2008]火星人prefix Splay+二分
1014: [JSOI2008]火星人prefix 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1014 Description 火星人 ...
- bzoj 1014: [JSOI2008]火星人prefix hash && splay
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3154 Solved: 948[Submit][ ...
- 求帮看!!!!BZOJ 1014 [JSOI2008]火星人prefix
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4164 Solved: 1277[Submit] ...
- 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] ...
- 1014: [JSOI2008]火星人prefix
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Description 火星人最近研究了一种操作:求一个字串两个后缀 ...
- bzoj千题计划106:bzoj1014 [JSOI2008]火星人prefix
http://www.lydsy.com/JudgeOnline/problem.php?id=1014 两个后缀的最长公共前缀:二分+hash 带修改带插入:splay维护 #include< ...
随机推荐
- nginx开机自启动
配置步骤:1 . vi /etc/init.d/nginx2. chkconfig --level nginx 2345 on --重点 --------------------以下为nginx配置文 ...
- Struts1文件上传
package org.zln.struts.domain; import org.apache.struts.upload.FormFile; /** * Created by sherry on ...
- 【POJ 2572 Advertisement】
Time Limit: 1000MSMemory Limit: 10000K Total Submissions: 947Accepted: 345Special Judge Description ...
- 怎么替换jar包里面的文件?
很多时候,我们需要替换包含在jar包里面的文件,例如修改里面的配置文件. 由于jar包已经生成,在不想重新用eclipse导出的情况下,我们怎么修改jar包里面的文件呢? 其实说出来很简单,可以使用以 ...
- js 日期获去及格式化
原文地址:http://www.cnblogs.com/qinpengming/archive/2012/12/03/2800002.html Js获取当前日期时间及格式化操作 var myDate ...
- MFC 监控界面上所有文本框值的变化
//控件消息,菜单,按钮等 BOOL CXXDlg::OnCommand(WPARAM wParam, LPARAM lParam) { // TODO: 在此添加专用代码和/或调用基类 int wm ...
- [01]url请求到渲染
http状态码有哪些?分别表示什么意思?状态码告知从服务器返回的请求结果.2XX表明请求被正常处理了.200OK.204No Content(服务器接收的请求已经处理成功,但在返回的响应报文中不包含实 ...
- javascript学习教程
我来班门弄斧一下吧,把我JavaScript学习过程中常去的一些网站分享给大家: =========================增加================================ ...
- 按小时或天切割Nginx日志
#按小时或天切割Nginx日志到备份文件夹 LOGS_PATH=/home/www/logs/thc SAVE_PATH=/home/www/logs/thc YESTERDAY=$(date -d ...
- python基础(3)_列表、元组、字典
一.列表 定义:[ ] 内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素 特性: > 可存放多个值 > 可修改指定索引位置对应的值,可变 > 按照从左到右的顺序定义列表 ...