[LOJ6198]谢特
loj
description
给你一个字符串和一个数组\(w_i\),定义\(\mbox{LCP}(i,j)\)为\(i,j\)两个后缀的最长公共前缀。求\(\max_{i,j}\mbox{LCP}(i,j)+(w_i\ \mbox{xor}\ w_j)\)。
\(n \le 10^5\)
sol
首先,\(\mbox{LCP}(i,j)\)是后缀排序上的一段连续区间的\(\mbox{Height}\)最小值。
那么我们可以枚举这个最小值出现的位置,那么跨越这个位置的所有点对的\(\mbox{LCP}\)就确定了。
接下来我们只要考虑最大化\(w_i\ \mbox{xor}\ w_j\)。
显然可以用可持久化\(\mbox{Tire}\)树实现,复杂度是查询次数\(\times \log n\)的。
算法流程大致是这样的:先找到\(\mbox{Height}\)最小的位置\(p\),计算所有跨越\(p\)的点对的答案。枚举分割点两侧\(size\)较小的一侧,在可持久化\(\mbox{Tire}\)树上查询它和另一侧异或的最大值。接着两侧被完全割裂开,可以分别递归下去处理。
考虑这个东西的时间复杂度。可以发现这就是一个倒着做的启发式合并,所以复杂度就是\(O(n\log^2n)\)。
当然也可以按\(\mbox{Height}\)从大到小启发式合并,复杂度是一样的。
code
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){int x=0,w=1;char ch=getchar();while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();if (ch=='-') w=0,ch=getchar();while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return w?x:-x;
}
const int N = 1e5+5;
struct node{int ch[2],sz;}tr[N*35];
int n,t[N],x[N],y[N],SA[N],Rank[N],Height[N],st[19][N],lg[N],rt[N],tot,w[N],ans;
char s[N];
bool cmp(int i,int j,int k){return y[i]==y[j]&&y[i+k]==y[j+k];
}
void getSA(){int m=30;for (int i=1;i<=n;++i) ++t[x[i]=s[i]-'a'+1];for (int i=1;i<=m;++i) t[i]+=t[i-1];for (int i=n;i;--i) SA[t[x[i]]--]=i;for (int k=1;k<=n;k<<=1){int p=0;for (int i=0;i<=m;++i) y[i]=0;for (int i=n-k+1;i<=n;++i) y[++p]=i;for (int i=1;i<=n;++i) if (SA[i]>k) y[++p]=SA[i]-k;for (int i=0;i<=m;++i) t[i]=0;for (int i=1;i<=n;++i) ++t[x[y[i]]];for (int i=1;i<=m;++i) t[i]+=t[i-1];for (int i=n;i;--i) SA[t[x[y[i]]]--]=y[i];swap(x,y);x[SA[1]]=p=1;for (int i=2;i<=n;++i) x[SA[i]]=cmp(SA[i],SA[i-1],k)?p:++p;if (p>=n) break;m=p;}for (int i=1;i<=n;++i) Rank[SA[i]]=i;for (int i=1,j=0;i<=n;++i){if (j) --j;while (s[i+j]==s[SA[Rank[i]-1]+j]) ++j;Height[Rank[i]]=j;st[0][i]=i;}for (int i=2;i<=n;++i) lg[i]=lg[i>>1]+1;for (int j=1;j<=lg[n];++j)for (int i=1;i+(1<<j)-1<=n;++i)if (Height[st[j-1][i]]<Height[st[j-1][i+(1<<j-1)]])st[j][i]=st[j-1][i];else st[j][i]=st[j-1][i+(1<<j-1)];
}
int cal(int l,int r){int k=lg[r-l+1];if (Height[st[k][l]]<Height[st[k][r-(1<<k)+1]]) return st[k][l];return st[k][r-(1<<k)+1];
}
void modify(int &x,int p,int dep){tr[++tot]=tr[x];++tr[x=tot].sz;if (!~dep) return;modify(tr[x].ch[(p>>dep)&1],p,dep-1);
}
int query(int x,int y,int p,int dep){if (!~dep) return 0;int c=(p>>dep)&1;c^=1;if (tr[tr[x].ch[c]].sz-tr[tr[y].ch[c]].sz) return query(tr[x].ch[c],tr[y].ch[c],p,dep-1)|(1<<dep);c^=1;return query(tr[x].ch[c],tr[y].ch[c],p,dep-1);
}
void solve(int l,int r){if (l==r) return;int mid=cal(l+1,r)-1;if (mid-l+1<=r-mid){for (int i=l;i<=mid;++i)ans=max(ans,Height[mid+1]+query(rt[r],rt[mid],w[SA[i]],18));}else{for (int i=mid+1;i<=r;++i)ans=max(ans,Height[mid+1]+query(rt[mid],rt[l-1],w[SA[i]],18));}solve(l,mid);solve(mid+1,r);
}
int main(){n=gi();scanf("%s",s+1);getSA();for (int i=1;i<=n;++i) w[i]=gi();for (int i=1;i<=n;++i) modify(rt[i]=rt[i-1],w[SA[i]],18);solve(1,n);printf("%d\n",ans);return 0;
}
转载于:https://www.cnblogs.com/zhoushuyu/p/9385717.html
[LOJ6198]谢特相关推荐
- Go 领军人物谢孟军:智能制造渴望银弹,首先要摒弃偏见
2019 年 1 月 13 日,TGO 鲲鹏会厦门分会正式成立,数百名技术人赶赴现场为庆祝 TGO 鲲鹏会厦门分会的诞生. 本篇文章根据谢孟军在活动现场分享的「基于工业大数据下的工厂系统实践」整理,有 ...
- 谢尔盖.布林的早期思想_谷歌联合创始人谢尔盖·布林(Sergey Brin)谈人工智能与自动化...
谢尔盖.布林的早期思想 Here are three links worth your time: 这是三个值得您花费时间的链接: Google cofounder Sergey Brin talks ...
- 谢文睿:西瓜书 + 南瓜书 吃瓜系列 11. 贝叶斯分类器
吃瓜教程--西瓜书+南瓜书 Datawhale南瓜书是经典机器学习教材<机器学习>(西瓜书)的公式推导解析指南,旨在让在学习西瓜书的过程中,再也没有难推的公式,学好机器学习. 内容属性:机 ...
- 谢文睿:西瓜书 + 南瓜书 吃瓜系列 9. 集成学习(上)
Datawhale南瓜书是经典机器学习教材<机器学习>(西瓜书)的公式推导解析指南,旨在让在学习西瓜书的过程中,再也没有难推的公式,学好机器学习. 航路开辟者:谢文睿.秦州 开源内容:ht ...
- 谢文睿:西瓜书 + 南瓜书 吃瓜系列 8. 软间隔与支持向量回归
Datawhale南瓜书是经典机器学习教材<机器学习>(西瓜书)的公式推导解析指南,旨在让在学习西瓜书的过程中,再也没有难推的公式,学好机器学习. 航路开辟者:谢文睿.秦州 开源内容:ht ...
- 对话谢宝友:搞真正自研的国产操作系统,而不是伪创新
作者 | 郑丽媛 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 从国外操作系统的长期垄断到中国自主研发操作系统数十年的起落浮沉,技术自主创新独立已成为国产基础软件的主要突破口.近几年间 ...
- 港科大谢丹阳教授问诊未来,预测长远趋势与转折点
阳春三月,万象更新,2020年注定是不平凡的一年!有激荡就会遇见变革,有挑战就会迎来机遇.今天总会过去,未来将会怎样? 香港科大商学院内地办事处重磅推出全新升级的<袁老师访谈录>全新系列[ ...
- 专访 | 微软首席数据科学家谢梁:从经济学博士到爬坑机器学习,这十年我都经历了啥?
谢梁,美国微软总部首席数据科学家,本科毕业于西南财经大学经济学专业,然后在中国工商银行从事信贷评估工作,一年后辞职到纽约州立大学学习应用计量经济学.研究兴趣主要是混合模型(mixed model)和数 ...
- 计算机网络与通信pdf谢希仁_考研刷题资料谢希仁《计算机网络》(第7版)配套题库【考研真题精选(部分视频讲解)+章节题库】...
谢希仁<计算机网络>(第7版)配套题库[考研真题精选(部分视频讲解)+章节题库] 本书是谢希仁<计算机网络>(第7版)教材的配套题库,主要包括以下内容: 第一部分为考研真题精选 ...
- 每人300万激励科学探索,北大谢涛、清华朱军等50人获奖,腾讯这个大奖公布...
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 编辑丨机器之心 在昨日刚刚结束的第二届「科学探索奖」颁奖典礼上,北京大学谢涛.清华大学朱军等几位学者成 ...
最新文章
- 【内核】嵌入式linux内核的五个子系统
- 转载: Python os 模块的功能以及子函数介绍
- word 段显示在页面最下方_Word你说的白是什么白
- RTSP再学习 -- Hi3516A RTSP实例
- android 模拟器read-only file system,WAC启动Android模拟器 transfer error: Read-only file system错误解决方法...
- 产品经理的肾,是怎么坏的?
- Android Intent Action 大全
- 网络编程之 进程间的通信之管道的使用
- AnyForWeb告诉你什么才是“最好的”编程语言
- 广东高等学校计算机水平考试准考证打印,广东高考准考证打印系统
- 软件开发文档编写规范
- WPF在资源内嵌入字体
- 能破解百度网盘提取码,云盘万能钥匙宣布关闭!
- WebRTC源码架构浅析
- AISG2.0(二)——什么是电调天线,及AISG在其中的应用
- 计算机音乐苹果铃声,苹果铃声设置歌曲 苹果铃声怎么设置自己的歌
- Git | git的简单使用教程
- 运维日志审计是什么意思?用什么工具好?
- Java给pdf添加页码(这是我之前的一篇文章)出现内存溢出Java heap space
- 充电桩测试设备TK4860C交流充电桩检定装置
热门文章
- OSM(OpenStreetMap)使用简述
- Win10 安装Docker 杂记
- Python爬虫 使用Selenium爬取腾讯招聘信息
- 2022 最新 IntelliJ IDEA 2022 详细配置步骤演示(图文版)
- QR码生成原理(一)
- C++中如何创建一个类?
- 计算机内存和显卡,电脑显卡和内存怎么看
- 华为畅享8plus停产了吗_华为畅享8和Plus哪个好? 华为畅享8 Plus与畅享8区别对比评测...
- 华为荣耀20和x10比较_华为畅享20 Pro和荣耀X10哪个好 配置参数谁更胜一筹
- Ubuntu 开机自动开启数字键小键盘