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的更多相关文章

  1. 1014: [JSOI2008]火星人prefix - BZOJ

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

  2. BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6243  Solved: 2007[Submit] ...

  3. BZOJ 1014: [JSOI2008]火星人prefix Splay+二分

    1014: [JSOI2008]火星人prefix 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1014 Description 火星人 ...

  4. bzoj 1014: [JSOI2008]火星人prefix hash && splay

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3154  Solved: 948[Submit][ ...

  5. 求帮看!!!!BZOJ 1014 [JSOI2008]火星人prefix

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4164  Solved: 1277[Submit] ...

  6. BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )

    用splay维护序列, 二分+hash来判断LCQ.. #include<bits/stdc++.h> using namespace std; typedef unsigned long ...

  7. BZOJ 1014 [JSOI2008]火星人prefix (Splay + Hash + 二分)

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8112  Solved: 2569[Submit] ...

  8. 1014: [JSOI2008]火星人prefix

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MB Description 火星人最近研究了一种操作:求一个字串两个后缀 ...

  9. bzoj千题计划106:bzoj1014 [JSOI2008]火星人prefix

    http://www.lydsy.com/JudgeOnline/problem.php?id=1014 两个后缀的最长公共前缀:二分+hash 带修改带插入:splay维护 #include< ...

随机推荐

  1. 2017Nowcoder Girl初赛重现赛

    https://ac.nowcoder.com/acm/contest/315#question A.平方数 代码: #include <bits/stdc++.h> using name ...

  2. PAT L2-019 悄悄关注

    https://pintia.cn/problem-sets/994805046380707840/problems/994805059731177472 新浪微博上有个“悄悄关注”,一个用户悄悄关注 ...

  3. CentOS7 php 安装 amqp扩展

    继续安装完 rabbitmq后,安装最新 php amqp扩展 http://www.cnblogs.com/8000cabbage/p/7788575.html 参考:carson 1.安装rabb ...

  4. 【bzoj2783】[JLOI2012]树 树上倍增

    题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不必一 ...

  5. 计蒜客16492 building(二分线段树/分块)

    题解: 考虑用线段树维护楼的最大值,然后这个问题就很简单了. 每次可以向左二分出比x高的第一个楼a,同理也可以向右二分出另一个楼b,如果a,b都存在,答案就是b-a-1. 注意到二分是可以直接在线段树 ...

  6. 【算法】CDQ分治 -- 三维偏序 & 动态逆序对

    初次接触CDQ分治,感觉真的挺厉害的.整体思路即分而治之,再用之前处理出来的答案统计之后的答案. 大概流程是(对于区间 l ~ r): 1.处理 l ~mid, mid + 1 ~ r 的答案: 2. ...

  7. wmic的用法

    原始文章链接:http://blog.sina.com.cn/s/blog_5fb265c70100w4d0.html 一.wmic的基本命令格式简析 经常看网上的相关资料的话,读者可能会对wmic有 ...

  8. BZOJ5343 [Ctsc2018]混合果汁 【二分 + 主席树】

    题目链接 BZOJ5343 题解 明显要二分一下美味度,然后用尽量少的价格去购买饮料,看看能否买到\(L\)升,然后看看能否控制价格在\(g\)内 尽量少的价格,就优先先选完便宜的饮料,由于询问的是一 ...

  9. 【BZOJ 1082】[SCOI2005]栅栏 二分+dfs

    对于最优解我们发现所有的最优解都可以是前多少多少个,那么我们就二分这个前多少多少个,然后用dfs去判解,我们发现在dfs的过程中如果不剪枝几乎必T,所以我们就需要一些有效的剪枝 I. 我们在枚举过程中 ...

  10. [洛谷P2016] 战略游戏 (树形dp)

    战略游戏 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得 ...