CF 280B -——Maximum Xor Secondary(单调栈)

探讨了如何在给定的不重复整数序列中,高效寻找任意区间内的最大及次大元素的异或值,并进一步找出所有可能区间中该值的最大值。采用单调栈优化算法,将复杂度降至O(n),实现快速求解。

Bike loves looking for the second maximum element in the sequence. The second maximum element in the sequence of distinct numbers x1, x2, ..., xk (k > 1) is such maximum element xj, that the following inequality holds: .

The lucky number of the sequence of distinct positive integers x1, x2, ..., xk (k > 1)is the number that is equal to the bitwise excluding OR of the maximum element of the sequence and the second maximum element of the sequence.

You've got a sequence of distinct positive integers s1, s2, ..., sn (n > 1). Let's denote sequence sl, sl + 1, ..., sr as s[l..r] (1 ≤ l < r ≤ n). Your task is to find the maximum number among all lucky numbers of sequences s[l..r].

Note that as all numbers in sequence s are distinct, all the given definitions make sence.

Input

The first line contains integer n (1 < n ≤ 105). The second line contains n distinct integers s1, s2, ..., sn (1 ≤ si ≤ 109).

Output

Print a single integer — the maximum lucky number among all lucky numbers of sequences s[l..r].

Examples

Input

5
5 2 1 4 3

Output

7

Input

5
9 8 3 5 7

Output

15

Note

For the first sample you can choose s[4..5] = {4, 3} and its lucky number is (4 xor 3) = 7. You can also choose s[1..2].

For the second sample you must choose s[2..5] = {8, 3, 5, 7}.

题意:给一个长度为 n 的序列,元素不重复,求任意区间中的最大元素与次大元素的异或值,然后再取这些值的最大值,注意区间长度任意。

题解:如果暴力的话是 O(n ^ 2) 的复杂度,显然不行,所以就需要用单调栈维护一下,O(n)解决,找到第一个比它大的数,看代码吧!!

#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
const int MAX = 1e5+100;
typedef long long ll;
ll a[MAX];
stack<ll> s;
int main(){
	int n;
	scanf("%d",&n);
	for (int i = 0; i < n;i++){
		scanf("%lld",&a[i]);
	}
	ll ans=0;
	for (ll i = n-1; i >= 0;i--){
		while(!s.empty()&&a[s.top()]<a[i]) s.pop();//单调栈找到第一个比它大的数 反向跑
		if(!s.empty()) ans=max(ans,a[s.top()]^a[i]);
		s.push(i);
	}
	for (ll i = 0; i < n;i++){
		while(!s.empty()&&a[s.top()]<a[i]) s.pop();//单调栈找到第一个比它大的数 正向跑
		if(!s.empty()) ans=max(ans,a[s.top()]^a[i]);
		s.push(i);
	}
// 必须两个方向跑,要不然会有遗漏
	printf("%lld\n",ans);
	return 0;
}

 

innovus 7> setStreamOutMode -check_map_file true -labelAllPinShape true -streamVersion 5 -textSize 0.3 innovus 8> streamOut "/home/ic/LYF/TPZ018/Newwen/zhuang/output.gds" \ + -libName DesignLib \ + -mapFile "streamOut.map" \ + -merge "/home/ic/LYF/TPZ018/tpz018nv_280b_gdsu5lm/TSMCHOME/digital/Back_End/gds/tpz018nv_280b/mt_2/5lm/tpz018nv.gds" \ + -units 1000 \ + -mode ALL Merge file: /home/ic/LYF/TPZ018/tpz018nv_280b_gdsu5lm/TSMCHOME/digital/Back_End/gds/tpz018nv_280b/mt_2/5lm/tpz018nv.gds has version number: 5 Parse flat map file... Writing GDSII file ... ****** db unit per micron = 1000 ****** ****** output gds2 file unit per micron = 1000 ****** ****** unit scaling factor = 1 ****** Output for instance Output for bump Output for physical terminals Output for logical terminals Output for regular nets Output for special nets and metal fills Output for via structure generation total number 0 Statistics for GDS generated (version 5) ---------------------------------------- Stream Out Layer Mapping Information: GDS Layer Number GDS Layer Name ---------------------------------------- 79 COMP 80 DIEAREA 107 VIAD 167 VIAD 28 METAL3 17 VIA12 15 CONT 16 METAL1 18 METAL2 27 VIA23 40 METAL1 41 METAL2 42 METAL3 101 METAL1 103 METAL3 102 METAL2 Stream Out Information Processed for GDS version 5: Units: 1000 DBU Object Count ---------------------------------------- Instances 776 Ports/Pins 0 Nets 0 Via Instances 0 Special Nets 0 Via Instances 0 Metal Fills 0 Via Instances 0 Metal FillOPCs 0 Via Instances 0 Metal FillDRCs 0 Via Instances 0 Text 444 metal layer METAL1 321 metal layer METAL3 123 Blockages 0 Custom Text 0 Custom Box 0 Trim Metal 0 Scanning GDS file /home/ic/LYF/TPZ018/tpz018nv_280b_gdsu5lm/TSMCHOME/digital/Back_End/gds/tpz018nv_280b/mt_2/5lm/tpz018nv.gds to register cell name ...... Merging GDS file /home/ic/LYF/TPZ018/tpz018nv_280b_gdsu5lm/TSMCHOME/digital/Back_End/gds/tpz018nv_280b/mt_2/5lm/tpz018nv.gds ...... ****** Merge file: /home/ic/LYF/TPZ018/tpz018nv_280b_gdsu5lm/TSMCHOME/digital/Back_End/gds/tpz018nv_280b/mt_2/5lm/tpz018nv.gds has version number: 5. ****** Merge file: /home/ic/LYF/TPZ018/tpz018nv_280b_gdsu5lm/TSMCHOME/digital/Back_End/gds/tpz018nv_280b/mt_2/5lm/tpz018nv.gds has units: 1000 per micron. ****** unit scaling factor = 1 ****** ------------------------------------------------------------ The below objects exist in innovus database, but they are not mapped to gds file, please verify the layer map file to confirm it is expected.: Lef Layer Name Object Type Comment ------------------------------------------------------------ ------------------------------------------------------------ The below objects exist in innovus database, but they are not streamed out to gds file.: Object Count ------------------------------------------------------------ Ports/Pins 0 Nets 0 Via Instances 0 Special Nets 0 Via Instances 0 Metal Fills 0 Via Instances 0 Metal FillOPCs 0 Via Instances 0 Metal FillDRCs 0 Via Instances 0 Vias 0 Text 0 Blockages 0 Custom 0 Trim Metal 0 ######Streamout is finished! innovus 9>
最新发布
07-04
<think>我们正在处理一个关于Innovus工具导出GDSII文件时遇到的问题:导出的GDS中Ports/Pins和Nets的数量为0。这通常是由于映射问题或配置错误导致的。以下将逐步分析可能的原因和解决方案。###1.检查LEF/DEF中的PIN定义在导出GDS之前,确保设计中的PIN在LEF/DEF文件中正确定义。如果LEF中没有定义PIN,那么在GDS中就无法正确映射。可以通过以下步骤检查:-确认LEF文件是否包含完整的PIN定义。-在Innovus中使用`checkPin`命令检查PIN的几何形状和层次是否正确。 ###2.确保正确的映射文件GDSII导出需要一个映射文件(mapfile),将设计中的层和数据类型(Layer/DataType)映射到GDS的层号。如果映射文件中没有包含PIN或NET的层,或者映射错误,就会导致这些元素无法导出。请检查:-映射文件是否包含了PIN(通常为text层)和金属层(用于NET)的映射。-确认映射文件的语法正确,特别是对于PIN的映射,通常需要将PIN映射到GDS的TEXT层。例如,一个典型的映射文件片段可能包含:``` layerNamelayerPurposegdsNumbergdsDataTypeMETAL1drawing110PINdrawing250```###3.使用正确的streamOut选项在Innovus的`streamOut`命令中,确保启用了导出PIN和NET的选项。常用的相关选项包括: -`-pin{all|none |geometry}`:指定导出PIN,推荐使用`all`或`geometry`。 -`-net {all |none |geometry}`:指定导出NET,推荐使用`all`或`geometry`。 -`-text{all| none}`:导出文本,通常PIN需要文本标签。 示例命令:```tclstreamOutfinal.gds\-mapFile layer.map \-libNamemylib \-pin all\-netall \-text all\-merge {third_party.gds}```###4.检查第三方GDS的合并如果导出的GDS中需要合并第三方GDS(如IP的GDS),确保合并操作没有覆盖或干扰设计的PIN和NET。可以通过以下方式检查:-单独导出设计(不合并第三方GDS)查看PIN和NET是否存在。-检查第三方GDS是否使用了与设计相同的层号定义,避免冲突。###5.验证GDS内容使用GDS查看工具(如KLayout或Cadence Virtuoso)检查导出的GDS文件:-确认PIN(通常为文本)是否出现在预期的位置。-检查NET(金属连线)是否可见。-注意:有时PIN可能被放置在较高的层次,需要确保查看时打开了所有层次。 ###6.检查设计中的PIN和NET是否有效如果设计中没有定义PIN(例如,在顶层设计中所有的端口都是隐式的),或者NET没有几何形状(例如,只有逻辑连接而没有物理连线),那么导出时自然为空。确保: -设计已经完成了布局布线,并且有物理实现。 -使用`dbGet`等命令检查设计中的PIN和NET是否有几何形状。 ###7.更新Innovus版本有时,软件版本可能存在已知问题。检查当前使用的Innovus版本,并查看是否有相关的补丁或更新版本。 ###8.参考Cadence官方文档和社区如果以上步骤仍无法解决问题,建议参考Cadence官方文档(如Innovus UserGuide)中关于streamOut的部分,或在Cadence支持社区搜索类似问题。 ###示例解决方案步骤1.确认LEF/DEF中PIN定义完整。 2.检查并修正映射文件,确保PIN和NET的层正确映射。 3.在streamOut命令中明确指定`-pin all-net all-textall`。 4.单独导出设计(不合并第三方GDS)以验证问题。5.使用GDS查看工具检查结果。 通过以上步骤,通常可以解决GDS导出中PIN和NET数量为0的问题。 §§相关问题§§1.如何检查LEF文件中PIN定义是否正确?2.Innovus中如何调试映射文件(mapfile)? 3.除了PIN和NET,GDS导出时还应注意哪些常见问题?4.如何验证GDS文件的正确性?</think>### Innovus streamOut 导出 GDS 时 Ports/Pins 和 Nets 数量为 0 的解决方案 此问题通常由 **层映射错误** 或 **数据导出配置缺失** 导致。以下是系统化的解决流程: --- #### 1. **检查层映射文件 (Layer Mapping File)** [核心步骤] - **问题**:GDSII 需要将设计层映射到物理制造层,若 PIN/NET 层未正确映射,会导致数据丢失。 - **解决方案**: - 确认映射文件包含 `PIN` 和 `NET` 的文本层定义,例如: ```tcl # layer.map 示例 PIN drawing 25 0 # 将PIN映射到GDS层25 METAL1 drawing 11 0 TEXT drawing 25 0 # 文本标签层 ``` - 通过以下命令验证映射: ```tcl streamOut preview -mapFile layer.map ``` --- #### 2. **启用 PIN/NET 导出选项** [关键配置] - 在 `streamOut` 命令中**显式启用**相关参数: ```tcl streamOut design.gds \ -mapFile layer.map \ -libName myLib \ -pin {geometry text} \ ;# 导出PIN几何形状和文本 -net {geometry} \ ;# 导出NET几何形状 -text all \ ;# 导出所有文本标签 -merge {third_party.gds} ;# 合并第三方GDS ``` - **参数说明**: - `-pin geometry`:导出 PIN 的物理形状 - `-pin text`:导出 PIN 名称文本 - `-net geometry`:导出金属连线 --- #### 3. **验证设计数据完整性** - **检查 PIN/NET 是否存在**: ```tcl # 检查PIN数量 dbGet [dbGetTopDesign].terms.name # 检查NET数量 dbGet [dbGetTopDesign].nets.name ``` *若返回空列表,说明设计未定义物理PIN/NET*[^1]。 - **修复方法**: - 重新生成 PIN:`derive_pg_connection -create_pins` - 确保布局后物理数据已生成:`saveDesign -physical post_route.enc` --- #### 4. **调试第三方 GDS 合并** - **问题**:第三方 GDS 可能覆盖设计层。 - **解决方案**: - 单独导出设计(不含 `-merge`)验证 PIN/NET 是否正常 - 检查第三方 GDS 层号是否冲突:`gdsDump third_party.gds -summary` --- #### 5. **验证 GDS 输出** 使用 GDS 查看工具(如 KLayout)检查: - 打开 `design.gds`,搜索 `TEXT` 层(PIN 名称) - 检查金属层(如 METAL1)是否有连线图形 - 若文本缺失,检查映射文件的 `TEXT drawing` 定义 --- ### 常见错误原因总结 | 问题类型 | 现象 | 修复方法 | |-------------------|-----------------------|------------------------------| | 映射文件缺失 PIN 层 | PIN/NET 数量为 0 | 添加 `PIN drawing` 到映射文件 | | 未启用 -pin 选项 | 仅PIN丢失,NET正常 | 添加 `-pin {geometry text}` | | 物理数据未生成 | dbGet 查询为空 | 重新布局或生成物理连接 | | 层号冲突 | 合并后部分层消失 | 修改第三方GDS层号或映射文件 | > ⚠️ **重要提示**:Innovus 不会默认导出 PIN/NET 的文本标签,必须显式启用 `-pin text` 和 `-text all`[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心脏dance

如果解决了您的疑惑,谢谢打赏呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值