Splay树
Splay树,即二叉伸展树,是一种非严格平衡的二叉搜索树,由丹尼尔·斯立特Daniel Sleator 和 罗伯特·恩卓·塔扬Robert Endre Tarjan 在1985年发明(摘自百度百科)。相比与AVL、红黑树而言,Splay树不需要额外地存储平衡信息,因此显得更为简洁,代码实现也较为简单(指150行代码),同时具有很强的扩展性,常用于算法竞赛中。
至于我为什么突然想要学Splay树,因为这是Tarjan发明的……没错,就是求强连通分量、割点、桥的Tarjan算法的那个Tarjan。事情的起因是我最近刚学完强连通分量,然后查了一下Tarjan的资料,发现原来是祖师爷级别的大佬,拿过图灵奖,发明了很多图论的重要算法和数据结构。于是就对Splay树产生了兴趣,虽然这玩意已经明显超过了我的算法水平(刚学完强连通的蒟蒻),但我还是自不量力毅然决然地花了两天手搓了Splay,然后又花了一天的时间调试。
那么废话了那么多,接下来正式介绍Splay树
(以下内容和代码部分抄袭参考自oiwiki和其他人的博客、文章等)
(图片均使用开源网站ioDraw绘制,感谢开源者的贡献)
基本成员
S ...
树状数组总结
最近花了两天时间学了下树状数组,然后感觉堪比玄学,故写篇文章总结一下。
2024.08.07 UPD:添加了树状数组的树形结构解释,与树状数组上二分。
树状数组(binary indexed tree),也叫BIT,又以其发明人名字被称为Fenwick树。树状数组利用二进制下标来维护区间和,能够做到以logn\log{n}logn的复杂度进行单点修改和区间求和,同时配合差分数组等结构,还能做到区间修改、单点查询和区间修改、区间查询等功能,相比与线段树来说更为简单和优雅。
基本知识
树状数组最为重要的一个设定就是lowbitlowbitlowbit——二进制最低位的1及其后面的0所组成的数字,相比与前缀和,树状数组的每一位维护的是(i−lowbit(i),i]\left(i-lowbit(i),i\right](i−lowbit(i),i]的区间和,比如6,二进制为110,那么这一位维护的就是原数组6到4100的区间和(不包含4)。
那么要如何计算一个数的lowbitlowbitlowbit呢?如果用一个1作为check来判断每一位是否是1,那么代码大概长这样:
1234for(in ...
第二次逆向题解
话不多说,直接开始
xor
下载下来有一个xor的无后缀文件和一个叫_MACOSX的文件夹,里面是一个叫._xor的文件,先查壳
._xor是一个二进制文件,就不放截图了省内存
用ida打开xor文件
用notepad–打开._xor文件
二进制文件有点意义不明,先看主函数,还是熟悉的strncmp函数,可以看到,输入的字符串是_b
从前面的程序可以看出flag长度为33,输入的字符串每一个字符跟前一个字符异或后才跟global比较,这个字符串的值也很好找,直接点就行
因为一按截图键窗口就没了,所以只能用手机拍照
那么接下来只要找出符合的输入就行了,因为异或的自反性,要还原一个字符只需将其与前一个字符异或即可
最终flag为QianQiuWanDai_YiTongJiangHu
不得不说,这个global字符串是真的抽象,一堆转义,眼睛都要看瞎了……
所以那个二进制文件到底有什么用
helloword
是不是少了个l
下载下来一个apk文件,用jadx打开,找主函数,直接就能看到flag,虽然看不懂java
reverse3
之前写过了,偷个懒
不一样的flag
一个exe ...
第一次逆向题解
应组长要求完成任务将第一次写逆向题的过程记录一下
顺便让以后的自己能够回过头来看看当初青涩的模样(感叹一下时光飞逝来装大佬)
正文
一、easyre
首先,照葫芦画瓢,下载文件并解压,可以看到一个exe文件,直接拖入ida,可以看到以下界面
然后继续照葫芦画瓢,找到主函数
然后就找到了flag……
虽然不知道发生了什么,但反正找到了,下一题。
二、reverse1
省略重复步骤,找到main函数
嗯……好像啥都没有,但可以看到一个main_0函数,点进去
然后翻译一下函数的内容,大概就是有一个str2字符串,程序会比较输入的字符串和str2字符串,如果一样就输出this is the right flag,那么目标应该就是要找到这个str2字符串的内容了
那么要如何查看呢,这个时候就要求助我们万能的百度了,于是知道了按x可以查看变量的交叉引用,然后就可以看到str2的值为hello_world
主要是因为真的找不到str2到底在哪里被赋的值
当然不要忘了前面有一个for循环对str2的值进行了改变,将asc值为111的字母改为了48。百度可知111为o,48为0。所以fla ...