Description

pps又开始dota视频直播了!一群每天被pps虐的蒟蒻决定学习pps的操作技术,他们把pps在这局放的技能记录了下来,每个技能用一个字符表示。经过研究,蒟蒻们发现字典序更大的连招威力更大。于是所有蒟蒻都想学习pps最强的连招。但是他们太弱了,不能学会整个视频里的连招,只能学会陈老师一段区间间内的连招,可是这个他们求不出,于是只好向你求助。为了蒟蒻们不再被pps虐(怎么可能),请你帮帮他们。简化题意:给你一个字符串,每次询问你一段区间的字典序最大的子串。

Solution

前几天WC的讲义上有讲这个题目……
离线,把询问按照rrr从小到大排序。对于同一个rrr,随着lll的右移,答案显然也是单调右移的,我们可以维护所有可能成为答案的位置,然后询问lower_boundlower\_boundlower_bound即可。考虑怎么维护这个东西,对于两个后缀s[i..n]、s[j..n](i&lt;j)s[i..n]、s[j..n](i&lt;j)s[i..n]、s[j..n](i<j),若他们的LCPLCPLCP长度为lenlenlen,且s[j+len]&gt;s[i+len]s[j+len]&gt;s[i+len]s[j+len]>s[i+len],那么在r&lt;j+lenr&lt;j+lenr<j+len的时候,是s[i..n]s[i..n]s[i..n]更优,而r≥j+lenr\ge j+lenr≥j+len时,则是s[j..n]s[j..n]s[j..n]更优,因为我们是从左到右扫rrr,所以我们要在扫到j+lenj+lenj+len的时候删掉s[i..n]s[i..n]s[i..n]这个后缀,所以用一个set维护这个单调栈。注意一个后缀被删后,比他更差的后缀也要同时被删除。

Code

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pa pair<int,int>
const int Maxn=100010;
const int inf=2147483647;
const unsigned int base=233;
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x*f;
}
int n,m,sta[Maxn],top=0,ans[Maxn];bool mark[Maxn];
char s[Maxn];
unsigned int h[Maxn],Pow[Maxn];
unsigned int g(int l,int r){return h[l]-h[r+1]*Pow[r-l+1];}
int lcp(int a,int b)
{int l=1,r=n-max(a,b)+1;while(l<=r){int mid=l+r>>1;if(g(a,a+mid-1)==g(b,b+mid-1))l=mid+1;else r=mid-1;}return l-1;
}
set<int>S;
vector<int>p[Maxn],del[Maxn];
vector<pa>query[Maxn];
bool dfs(int x)
{mark[x]=true;S.erase(x);for(int i=0;i<p[x].size();i++)if(!mark[p[x][i]])dfs(p[x][i]);
}
int main()
{scanf("%s",s+1);n=strlen(s+1);h[n+1]=0;for(int i=n;i;i--)h[i]=h[i+1]*base+s[i];Pow[0]=1;for(int i=1;i<=n;i++)Pow[i]=Pow[i-1]*base;m=read();for(int i=1;i<=m;i++){int l=read(),r=read();query[r].push_back(make_pair(l,i));}for(int r=1;r<=n;r++){S.insert(r);while(top){int t=lcp(r,sta[top]);if(s[r+t]<s[sta[top]+t])break;p[r].push_back(sta[top]);del[r+t].push_back(sta[top]);top--;}sta[++top]=r;for(int i=0;i<del[r].size();i++)if(!mark[del[r][i]])dfs(del[r][i]);for(int i=0;i<query[r].size();i++){pa t=query[r][i];ans[t.second]=*S.lower_bound(t.first);}}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}

[BZOJ]4453: cys就是要拿英魂! 单调栈+二分+hash相关推荐

  1. ●BZOJ 4453 cys就是要拿英魂!

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4453 题解: 后缀数组,离线询问,栈 看了一堆题解才看懂,太弱啦 ~ 如果对于一个区间[l, ...

  2. 洛谷 P4660 bzoj 1168 [ Baltic OI 2008 ] 手套 —— 分析+单调栈

    题目:https://www.luogu.org/record/show?rid=12702916 https://www.lydsy.com/JudgeOnline/problem.php?id=1 ...

  3. BZOJ 3401: [Usaco2009 Mar]Look Up 仰望( 单调栈 )

    n <= 105 , 其实是10 ^ 5 ....坑...我一开始写了个模拟结果就 RE 了.. 发现这个后写了个单调栈就 A 了... ---------------------------- ...

  4. bzoj 4237: 稻草人(CDQ分治+单调栈+二分)

    4237: 稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1352  Solved: 594 [Submit][Status][Discus ...

  5. bzoj 3238: [Ahoi2013]差异(后缀数组+单调栈)

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 3443  Solved: 1562 [Submit][Stat ...

  6. 【BZOJ】3039: 玉蟾宫(DP/单调栈)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3039 每次看到我的提交都有点淡淡的忧伤T_T.. 看到此题我想到用前缀和维护点ij向左和向上能拓展的 ...

  7. BZOJ 2388--旅行规划(分块单调栈二分)

    2388: 旅行规划 Time Limit: 50 Sec  Memory Limit: 128 MB Submit: 405  Solved: 118 [Submit][Status][Discus ...

  8. 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]

    题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...

  9. Loj#2880-「JOISC 2014 Day3」稻草人【CDQ分治,单调栈,二分】

    正题 题目链接:https://loj.ac/problem/2880 题目大意 给出平面上的nnn个点,然后求有多少个矩形满足 左下角和右上角各有一个点 矩形之间没有其他点 1≤n≤2×105,1≤ ...

  10. 【Codeforces549F】Yura and Developers [单调栈][二分]

    Yura and Developers Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input 4 ...

最新文章

  1. 人工智能治理需用好“人工”
  2. dig linux下的使用
  3. java并发中的延迟初始化
  4. wordpress 自定义分类url 重写_WordPress导航主题-WebStack导航主题
  5. 国内首家!腾讯云密钥管理系统通过密码应用验证,积极探索行业标准边界
  6. 如何在React Native中创建精美的动画加载器
  7. Bootstrap HTML 编码规范之语言属性
  8. 再谈C#里4个访问权限修饰符
  9. hive报错:Call from hostname/127.0.1.1 to localhost:9000 failed on connection exception.主节点9000端口拒绝访问.
  10. Prototype使用Class
  11. 【TWVRP】基于matlab遗传算法求解带时间窗的车辆路径问题【含Matlab源码 002期】
  12. 使用gui来初始化参数matlab,MATLAB GUI参数传递方式
  13. 使用UOS微信桌面版协议登录,wechaty免费版web协议又可以用了
  14. pycharm改变匹配括号的颜色
  15. 什么是前端,前端是什么?
  16. 手机远程启动热车!汽车远程启动有什么缺点?你都知道吗汽车手机远程启动优缺点,汽车手机远程启动怎么用,
  17. CPU,缓存,内存,外存全解析
  18. 工具分享--IDM下载工具利器,让下载速度提升一百倍
  19. python画神经网络结构图_神经网络结构画图
  20. 《黄花黄》安铁诗词作品摘录

热门文章

  1. Ubuntu 语言配置修改为英文
  2. 传奇服务器怪物不显示名字,传奇小地图显示怪物的一个问题
  3. Gmail 实验室产品经理 Todd Jackson 访谈录
  4. 深入理解Java虚拟机 4.JVM垃圾回收机制详解
  5. echarts scatter3D 图标陷进地图
  6. 年货:Python技术知识清单(数据科学)
  7. 技术类—Java笔试题2018
  8. 错误 C1189 #error MFC does not support WINVER less than 0x0501.
  9. 360校招——最后赢家(C++)
  10. 爱奇艺网络流量分析引擎 QNSM 及其应用