4453: cys就是要拿英魂!

Time Limit: 3 Sec Memory Limit: 128 MB
Submit: 66 Solved: 33
[Submit][Status][Discuss]
Description

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

Input

第一行是一个字符串S,表示pps放的技能
第二行一个正整数Q,表示询问个数
接下来Q行,每行两个正整数[l,r],表示询问区间[l,r]中的字典序最大的子串。
Output

Q行,每行一个正整数,表示该区间内字典序最大的子串的起始位置。

Sample Input

Lets_go_mod_p!52 23 32 51 102 9

Sample Output

23333

数据范围:

1<=|S|<=1000001<=Q<=1000001<=l<=r<=|S|

首先可以看出来,如果对于一个区间[l,r][l,r]有两个后缀i,ji,j他们呢个更优可以分这么几种情况来讨论(假设i<ji):
①:如果rank[i]>rank[j]rank[i]>rank[j],那么ii肯定比jj优。
②:如果rank[i]<rank[j]rank[i]&&lcp(i,j)<r−j+1lcp(i,j),那么j肯定比i优。
③:如果rank[i]<rank[j]rank[i]&&lcp(i,j)>=r−j+1lcp(i,j)>=r-j+1,那么i比j更优。
这样如果从后往前扫左端点的话,那么后面的区间就会被分成一块一块的,每一块内的最优值都是一样的,也就是说一个最优值影响的区间是连续的。(也就是当固定了左端点后右端点是单调的。)
每次新扫到一个左端点后,就可以看一下这个左端点影响到了后面哪一段区间。在影响的区间打上标记。
我刚开始本来想二分后面的区间,打标记的时候给线段树区间染色,这样是O(nlog2n)O(nlog^2n)的。
可以维护一个栈,栈中的每一个元素对应了一段区间。每次扫到一个左端点后,依次弹出栈顶元素,知道当前这个左端点不会影响到当前栈顶的这个区间了。
还有种情况是可能会影响到最后那个区间的一部分,这样需要在这个区间中二分一下这个区间从哪裂开。
时间复杂度是O(nlogn)O(nlogn)的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100010;
char s[N];
struct Q{int x,y,No;}q[N];
struct S{int v,l,r,No;}stack[N];
int n,m,T,top,t1[N],t2[N],c[N],sa[N],rank[N],height[N],st[N][20],Log[N],ans[N];
inline int in(){int x=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x;
}
inline bool cmp(int *y,int p,int q,int k){int o0,o1;o0=p+k>=n?-1:y[p+k];o1=q+k>=n?-1:y[q+k];return o0==o1&&y[p]==y[q];
}
inline void build_sa(){int i,k,p,*x=t1,*y=t2;for(i=0;i<m;++i) c[i]=0;for(i=0;i<n;++i) ++c[x[i]=s[i]];for(i=1;i<m;++i) c[i]+=c[i-1];for(i=n-1;~i;--i) sa[--c[x[i]]]=i;for(k=1;k<=n;k<<=1){for(p=0,i=n-k;i<n;++i) y[p++]=i;for(i=0;i<n;++i) if(sa[i]>=k) y[p++]=sa[i]-k;for(i=0;i<m;++i) c[i]=0;for(i=0;i<n;++i) ++c[x[y[i]]];for(i=1;i<m;++i) c[i]+=c[i-1];for(i=n-1;~i;--i) sa[--c[x[y[i]]]]=y[i];swap(x,y);x[sa[0]]=0;m=1;for(i=1;i<n;++i) x[sa[i]]=cmp(y,sa[i],sa[i-1],k)?m-1:m++;if(m>=n) break;}
}
inline void build_height(){int i,k=0,j;for(i=0;i<n;++i) rank[sa[i]]=i;for(i=0;i<n;++i){if(!rank[i]) continue;k=k?--k:k;j=sa[rank[i]-1];while(s[j+k]==s[i+k]) ++k;height[rank[i]]=k;}memset(st,127/3,sizeof(st));    for(i=0;i<n;++i) st[i][0]=height[i];for(j=1;j<=20;++j)for(i=0;i+(1<<(j-1))<n;++i)st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);for(j=0,i=1;i<=n;++i){if((1<<(j+1))<=i) ++j;Log[i]=j;}
}
inline int LCP(int x,int y){if(x>y) swap(x,y);int k=Log[y-x];++x;return min(st[x][k],st[y-(1<<k)+1][k]);
}
inline bool CMP(Q x,Q y){return x.x>y.x;}
#define mid (l+r)/2
inline bool check(int x,int y,int z){if(rank[x]>rank[y]) return true;int len=LCP(rank[x],rank[y]);if(len<z-y+1) return false;return true;
}
int main(){int i,j;scanf("%s",s);n=strlen(s);for(i=0;i<n;++i) m=max(m,(int)s[i]);++m;build_sa();build_height();T=in();for(i=1;i<=T;++i) q[i].x=in()-1,q[i].y=in()-1,q[i].No=i;sort(q+1,q+T+1,CMP);stack[0].l=n;stack[top=1].v=rank[n-1];stack[top].No=stack[top].l=stack[top].r=n-1;for(j=1;q[j].x==n-1;++j) ans[q[j].No]=n;for(i=n-2;~i&&j<=T;--i){int now=top,l,r,flag=0;for(;top;--top){l=check(i,stack[top].No,stack[top].l);r=check(i,stack[top].No,stack[top].r);if(l&&r) continue;if(!l&&!r) break;if(l&&!r){flag=1;break;}}if(flag){now=l=stack[top].l;r=stack[top].r;while(l<r){if(check(i,stack[top].No,mid)) now=max(now,mid),l=mid+1;else r=mid;}stack[top].l=now+1;stack[++top].v=rank[i];stack[top].r=now;stack[top].l=stack[top].No=i;}else{stack[++top].v=rank[i];stack[top].No=stack[top].l=i;stack[top].r=stack[top-1].l-1;}while(q[j].x==i&&j<=T){l=1;r=top;now=q[j].y;while(l<r){if(now>=stack[mid].l&&now<=stack[mid].r) break;if(now<stack[mid].l) l=mid+1;else r=mid;}ans[q[j].No]=stack[mid].No+1;++j;}}for(i=1;i<=T;++i) printf("%d\n",ans[i]);
}

[bzoj4453]cys就是要拿英魂!相关推荐

  1. bzoj4453: cys就是要拿英魂!(后缀数组+单调栈+set)

    传送门 stOstOstO 神题 OrzOrzOrz 题意: 给定一个串S,有Q个询问,每次问一个区间内字典序最大的子串. |S|,Q<=10^5,可以离线! 大佬的题解: 代码: #inclu ...

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

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

  3. 纪念张首晟教授:英魂长存于行行字迹 何惧漫漫征途

    著名美国华裔科学家,美国斯坦福大学终身教授,张首晟教授因病于2018年12月1日在旧金山逝世,享年55岁. 为了追忆张首晟教授的生平,张教授家人在美国西部时间5月1日下午于斯坦福举办纪念活动,邀请社会 ...

  4. linux能运行英魂之刃吗,英魂之刃需要什么电脑配置

    英魂之刃需要什么电脑配置 发表时间: 2016-03-31     作者:Next 英魂之刃为什么会卡,现在的电脑一般都能带得动的,只是英魂之刃如果你开全特效的话,有可能你的显卡会吃不消哦,下面我们来 ...

  5. 英魂之刃显示已将战斗服务器,英魂之刃战略版来袭,是挂名游戏还是搞事情?玩家:过于真实!...

    原标题:英魂之刃战略版来袭,是挂名游戏还是搞事情?玩家:过于真实! 虽然现在市面上的moba手游琳琅满目,但是小编我是独宠<英魂之刃>,尤其是英魂中我最爱的英雄李小龙.骨王和曹焱兵.而作为 ...

  6. 英魂之刃后台用Java,《英魂之刃》系统操作说明

    系统操作说明 一.在平台界面的右上角存在 1.点击 可以触发帮助系统,包括战斗引导.进入/创建房间.解锁战斗专精.解锁英魂和匹配游戏. 2.点击 可以触发系统设置,包括游戏设置.发起投降和回到游戏.游 ...

  7. 英魂之刃服务器维护进不去,英魂之刃口袋版为什么进不去 进不去解决方法

    英魂之刃,这款游戏自上线以来深受广大玩家们的喜爱,小骨为您带来有关英魂之刃的相关攻略,小伙伴们快来看看吧! 英魂之刃口袋版怎么进不去?最近有玩家在登陆过程中,无法正常进入游戏,在这里为你提供一些可能解 ...

  8. 短线盈亏指标 股票市场盈亏指标cys 盈亏指标分析选股公式副图

    通达信短线盈亏指标选股思路:为冲破结界扶摇直上九万里天空,地球有地平线,股价也有一个结界,没过这个结界之前,长期震荡,当股价冲破这个结界的时候,才能一飞万里. 股价可以比做一座大山,左边为上山,人往高 ...

  9. 英魂之刃服务器维护在几点,2016英魂之刃8.19有没有维护

    满意答案 yisiou217 2016.08.23 采纳率:52%    等级:12 已帮助:22983人 有的.内容如下: 1.更新新英雄苍天之拳 2.开放暮色堡垒(3C)地图测试,可在自定义游戏中 ...

  10. 英雄之刃显示服务器断开怎么办,常见问题_07073英魂之刃网页游戏官网

    问:英魂之刃萌小鸡活动中教材如何快速获得?答:在活动起劲啊,只要完成纷争圣坛,决战之谷,荣誉战场,的匹配胜利,就有几率不得若干各等级教材.最多可以同时放入5本教材,使用点券可以加速学习.5本相同的剪裁 ...

最新文章

  1. 论推荐系统与精细化运营
  2. 第十六届全国大学生智能车竞赛山东赛区成绩汇总
  3. win7完整卸载oracle11,win7安装与卸载oracle11g(32)
  4. 查看eclipse安装了哪些插件
  5. 微信生态下的营销洞察
  6. linux 一些常规操作合集 (cat grep awk chmod vim ..)
  7. 微信5.0公众平台企业服务号和订阅号怎样申请?
  8. 51CTO网友感谢信:昨天以940分的成绩顺利通过NE考试 在此特地感谢网工泡泡
  9. HPGL(PLT文件格式)文件解析及VS2017工程源码
  10. 智慧城管核心应用系统建设
  11. echarts实现组织结构图
  12. 从Hadoop到Spark、Flink,大数据处理框架十年激荡发展史!
  13. 生活不止眼前的苟且,还有诗和远方。如何理解?
  14. Ubuntu系统,window系统,利用闲置电脑搭建了一台服务器
  15. 高通三款处理器齐发布 全面死磕联发科
  16. 【解决方案】LaTeX插入svg图片
  17. Windows同一局域网如何文件共享
  18. C++11多线程第一篇:并发基本概念及实现,进程、线程基本概念
  19. 吴金贵有望二次助教国足 成顶替刘春明热门人选
  20. LDO与DCDC这次给它彻底搞懂

热门文章

  1. 二进制炸弹——拆弹实验
  2. 短信通知接口json报文开发设计总结
  3. 大学生php实训总结_php实训报告.doc
  4. Python调用百度API实现语音识别
  5. Stone教程:一行代码就可以把3D场景植入到普通网页中
  6. 威斯敏斯特教堂(西敏寺)墓碑上的话(WestMinster Abbey,When I was young and free...,修身齐家治国平天下)
  7. 2022年最新用最简单粗暴的方式讲解:pytest简介,框架基础应用,运行方式,失败用例重跑。直击核心
  8. 报错:TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the
  9. 自定义权限修改弹框_微信小程序自定义授权弹框
  10. vue 富文本编辑器提取纯文字