思路:

论文题……*n

倒过来接上 分奇偶讨论 求LCP 搞棵线段树即可

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 5555
int cases,pos,maxans,n,cntA[N],cntB[N],A[N],B[N],rk[N],sa[N],tsa[N],ht[N];
char s[N];
void SA(){
memset(cntA,0,sizeof(cntA));
for(int i=1;i<=n;i++)cntA[s[i]]++;
for(int i=1;i<=256;i++)cntA[i]+=cntA[i-1];
for(int i=n;i;i--)sa[cntA[s[i]]--]=i;
rk[sa[1]]=1;
for(int i=2;i<=n;i++)rk[sa[i]]=rk[sa[i-1]]+(s[sa[i]]!=s[sa[i-1]]);
for(int l=1;rk[sa[n]]<n;l<<=1){
memset(cntA,0,sizeof(cntA));
memset(cntB,0,sizeof(cntB));
for(int i=1;i<=n;i++)
cntA[A[i]=rk[i]]++,
cntB[B[i]=i+l<=n?rk[i+l]:0]++;
for(int i=1;i<=n;i++)cntA[i]+=cntA[i-1],cntB[i]+=cntB[i-1];
for(int i=n;i;i--)tsa[cntB[B[i]]--]=i;
for(int i=n;i;i--)sa[cntA[A[tsa[i]]]--]=tsa[i];
rk[sa[1]]=1;
for(int i=2;i<=n;i++)rk[sa[i]]=rk[sa[i-1]]+(A[sa[i]]!=A[sa[i-1]]||B[sa[i]]!=B[sa[i-1]]);
}
for(int i=1,j=0;i<=n;i++){
j=j?j-1:0;
while(s[i+j]==s[sa[rk[i]-1]+j])j++;
ht[rk[i]]=j;
}
}
int tree[N*8];
void build(int l,int r,int pos){
if(l==r){tree[pos]=ht[l];return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
build(l,mid,lson),build(mid+1,r,rson);
tree[pos]=min(tree[lson],tree[rson]);
}
int query(int l,int r,int pos,int L,int R){
if(l>=L&&r<=R)return tree[pos];
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<L)return query(mid+1,r,rson,L,R);
else if(mid>=R)return query(l,mid,lson,L,R);
else return min(query(l,mid,lson,L,R),query(mid+1,r,rson,L,R));
}
int main(){
scanf("%s",s+1),n=strlen(s+1);
s[n+1]='#';
for(int i=1;i<=n;i++)s[n+i+1]=s[n-i+1];
n=n+n+1;
SA(),build(1,n,1);
for(int i=1;i<=n/2;i++){
int tempx=min(rk[i],rk[n-i+1]),tempy=max(rk[i],rk[n-i+1]),jy;
jy=query(1,n,1,tempx+1,tempy);
if(maxans<jy*2-1)maxans=jy*2-1,pos=i-jy+1;
else if(maxans==jy*2-1&&pos>i-jy+1)pos=i-jy+1;
tempx=min(rk[i+1],rk[n-i+1]),tempy=max(rk[i+1],rk[n-i+1]);
jy=query(1,n,1,tempx+1,tempy);
if(maxans<jy*2)maxans=jy*2,pos=i-jy+1;
else if(maxans==jy*2&&pos>i-jy+1)pos=i-jy+1;
}
for(int i=pos;i<maxans+pos;i++)printf("%c",s[i]);
}

URAL 1297 后缀数组+线段树的更多相关文章

  1. BZOJ 1396: 识别子串( 后缀数组 + 线段树 )

    这道题各位大神好像都是用后缀自动机做的?.....蒟蒻就秀秀智商写一写后缀数组解法..... 求出Height数组后, 我们枚举每一位当做子串的开头. 如上图(x, y是height值), Heigh ...

  2. 【XSY1551】往事 广义后缀数组 线段树合并

    题目大意 给你一颗trie树,令\(s_i\)为点\(i\)到根的路径上的字符组成的字符串.求\(max_{u\neq v}(LCP(s_u,s_v)+LCS(s_u,s_v))\) \(LCP=\) ...

  3. Luogu4770 NOI2018你的名字(后缀数组+线段树)

    即求b串有多少个本质不同的非空子串,在a串的给定区间内未出现.即使已经8102年并且马上就9102年了,还是要高举SA伟大旗帜不动摇. 考虑离线,将所有询问串及一开始给的串加分隔符连起来,求出SA.对 ...

  4. BZOJ 2865 字符串识别 | 后缀数组 线段树

    集训讲字符串的时候我唯一想出正解的题-- 链接 BZOJ 2865 题面 给出一个长度为n (n <= 5e5) 的字符串,对于每一位,求包含该位的.最短的.在原串中只出现过一次的子串. 题解 ...

  5. bzoj 1396: 识别子串 && bzoj 2865: 字符串识别【后缀数组+线段树】

    根据height数组的定义,和当前后缀串i最长的相同串的长度就是max(height[i],height[i+1]),这个后缀贡献的最短不同串长度就是len=max(height[i],height[ ...

  6. Codeforces 1063F - String Journey(后缀数组+线段树+dp)

    Codeforces 题面传送门 & 洛谷题面传送门 神仙题,做了我整整 2.5h,写篇题解纪念下逝去的中午 后排膜拜 1 年前就独立切掉此题的 ymx,我在 2021 年的第 5270 个小 ...

  7. [CF1063F]String Journey[后缀数组+线段树]

    题意 在 \(S\) 中找出 \(t\) 个子串满足 \(t_{i+1}\) 是 \(t_{i}\) 的子串,要让 \(t\) 最大. \(|S| \leq 5\times 10^5\). 分析 定义 ...

  8. BZOJ 2865 字符串识别(后缀数组+线段树)

    很容易想到只考虑后缀长度必须为\(max(height[rk[i]],height[rk[i]+1])+1\)(即\([i,i+x-1]\)代表的串只出现过一次)然后我正着做一遍反着做一遍,再取一个\ ...

  9. [CF653F] Paper task - 后缀数组,线段树,vector

    [CF653F] Paper task Description 给定一个括号序列,统计合法的本质不同子串的个数. Solution 很容易想到,只要在传统统计本质不同子串的基础上修改一下即可. 考虑经 ...

随机推荐

  1. DB-MySQL:MySQL 教程

    ylbtech-DB-MySQL:MySQL 教程 1.返回顶部 1. MySQL 教程 MySQL 是最流行的关系型数据库管理系统,在WEB应用方面 MySQL 是最好的RDBMS(Relation ...

  2. ROS-OPENCV

    前言:opencv是一个开源的跨平台计算机视觉库. 前提:1.已下载并编译了相关功能包集,如还未下载,可通过git下载:https://github.com/huchunxu/ros_explorin ...

  3. ROS-SLAM-gmapping

    前言:gmapping是最常用和成熟的slam导航算法,gmapping功能包集成了Rao-Blackwellized粒子滤波算法,为开发者隐去了复杂的内部实现. 前提:已下载并编译了相关功能包集,如 ...

  4. Java入门第一季

    慕课网:http://www.imooc.com/learn/85 Java入门知识第一季 1.Java开发环境和IDE的使用: 2.变量和常量 3.常用的运算符 4.流程控制语句 5.数组:使用Ar ...

  5. net 线程挂起

    2013.10.18  通讯组件开发 情景: 主线程添加队列,子线程负责队列中消息发送.当队列中数据为空时,停止发送挂起子线程. 当主线程添加队列时,重新开启子线程进行消息发送. 方案一 但是不采用传 ...

  6. Broadcast Receiver广播接收器

    1.概述 广播接收器不仅能接受来自系统的内容,也可以接受来自其他app的内容.广播分为标准广播和有序广播. 2.标准广播 一种完全异步执行的广播,在广播发出之后几乎所有的广播接收器都在同一时刻接受到广 ...

  7. SQL的几个路径

    这个是主数据库文件存放的地方 C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER2014\MSSQL\DATA

  8. 手机上最简洁的"云笔记"软件

    ❗️注意:该文并不是真的给你介绍各类云笔记的对比 第三方云笔记的缺点 以前用MIUI和Flyme时,自带的记事本很好用,小巧简洁,路上想起什么就写下来,回去后登录网上的个人中心,拿出来加工一下就可以发 ...

  9. day08 数字,字符串类型内置方法

    目录 数字类型内置方法 为什么要有数据类型? 定义方式 方法 储存一个值or多个值? 有序or无序?(有序:有索引, 无序:无索引) 可变or不可变(可变:值变id不变,不可变:值变id也变) 字符串 ...

  10. js 时间戳 中国标准时间 年月日 日期之间的转换

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...