数孑一样大小的头上起包 有点痒有点怎排位

搞懂后缀数组!
为什么学后缀数组
后缀数组是一个比较强大的处理字符串的算法,是有关字符串的基础算法,所以必须掌握。
学会后缀自动机(SAM)就不用学后缀数组(SA)了?不,虽然SAM看起来更为强大和全面,但是有些SAM解决不了的问题能被SA解决,只掌握SAM是远远不够的。
有什么SAM做不了的例子?
比如果求一个串后缀的lcp方面的应用,这是SA可以很方便的用rmq来维护,但是SAM还要求lca,比较麻烦,还有就是字符集比较大的时候SA也有优势。
现在这里放道题,看完这个blog可能就会做了!:
你可想想这道题:你有一个01串S,然后定义一个前缀最右边的位置就是这个前缀的结束位置。现在有q多个询问,每个询问结束位置在l~r中不同前缀的最长公共后缀是多长?
|S|,q≤100000
构造后缀数组——SA先定义一些变量的含义
Str :需要处理的字符串(长度为Len)
Suffix[i] :Str下标为i ~ Len的连续子串(即后缀)
Rank[i] : Suffix[i]在所有后缀中的排名
SA[i] : 满足Suffix[SA[1]] & Suffix[SA[2]] …… & Suffix[SA[Len]],即排名为i的后缀为Suffix[SA[i]] (与Rank是互逆运算)
好,来形象的理解一下
后缀数组指的就是这个SA[i],有了它,我们就可以实现一些很强大的功能(如不相同子串个数、连续重复子串等)。如何快速的到它,便成为了这个算法的关键。而SA和Rank是互逆的,只要求出任意一个,另一个就可以O(Len)得到。
现在比较主流的算法有两种,倍增和DC3,在这里,就主要讲一下稍微慢一些,但比较好实现以及理解的倍增算法(虽说慢,但也是O(Len logLen))的。
进入正题——倍增算法
倍增算法的主要思想:对于一个后缀Suffix[i],如果想直接得到Rank比较困难,但是我们可以对每个字符开始的长度为2k的字符串求出排名,k从0开始每次递增1(每递增1就成为一轮),当2k大于Len时,所得到的序列就是Rank,而SA也就知道了。O(logLen)枚举k
这样做有什么好处呢?
设每一轮得到的序列为rank(注意r是小写,最终后缀排名Rank是大写)。有一个很美妙的性质就出现了!第k轮的rank可由第k - 1轮的rank快速得来!
为什么呢?为了方便描述,设SubStr(i, len)为从第i个字符开始,长度为len的字符串我们可以把第k轮SubStr(i, 2k)看成是一个由SubStr(i, 2k-1)和SubStr(i + 2k-1, 2k-1)拼起来的东西。类似rmq算法,这两个长度而2k-1的字符串是上一轮遇到过的!当然上一轮的rank也知道!那么吧每个这一轮的字符串都转化为这种形式,并且大家都知道字符串的比较是从左往右,左边和右边的大小我们可以用上一轮的rank表示,那么……这不就是一些两位数(也可以视为第一关键字和第二关键字)比较大小吗!再把这些两位数重新排名就是这一轮的rank。
我们用下面这张经典的图理解一下:
相信只要理解字符串的比较法则(跟实数差不多),理解起来并不难。#还有一个细节就是怎么把这些两位数排序?这种位数少的数进行排序毫无疑问的要用一个复杂度为长度*排序数的个数的优美算法——基数排序(对于两位数的数复杂度就是O(Len)的)。
基数排序原理: 把数字依次按照由低位到高位依次排序,排序时只看当前位。对于每一位排序时,因为上一位已经是有序的,所以这一位相等或符合大小条件时就不用交换位置,如果不符合大小条件就交换,实现可以用”桶”来做。(叙说起来比较奇怪,看完下面的代码应该更好理解,也可以上网查有关资料)
好了SA和Rank(大写R)到此为止就处理好了。(下面有详解代码!)。但我们发现,只有这两样东西好像没什么用,为了处理重复子串之类的问题,我们就要引入一个表示最长公共前缀的新助手Height数组!
构造最长公共前缀——Height同样先是定义一些变量
Heigth[i] : 表示Suffix[SA[i]]和Suffix[SA[i - 1]]的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀
H[i] : 等于Height[Rank[i]],也就是后缀Suffix[i]和它前一名的后缀的最长公共前缀
而两个排名不相邻的最长公共前缀定义为排名在它们之间的Height的最小值。
跟上面一样,先形像的理解一下:
高效地得到Height数组
如果一个一个数按SA中的顺序比较的话复杂度是O(N2)级别的,想要快速的得到Height就需要用到一个关于H数组的性质。
H[i] ≥ H[i - 1] - 1!
如果上面这个性质是对的,那我们可以按照H[1]、H[2]……H[Len]的顺序进行计算,那么复杂度就降为O(N)了!
让我们尝试一下证明这个性质 : 设Suffix[k]是排在Suffix[i - 1]前一名的后缀,则它们的最长公共前缀是H[i - 1]。都去掉第一个字符,就变成Suffix[k + 1]和Suffix[i]。如果H[i - 1] = 0或1,那么H[i] ≥ 0显然成立。否则,H[i] ≥ H[i - 1] - 1(去掉了原来的第一个,其他前缀一样相等),所以Suffix[i]和在它前一名的后缀的最长公共前缀至少是H[i - 1] - 1。
仔细想想还是比较好理解的。H求出来,那Height就相应的求出来了,这样结合SA,Rank和Height我们就可以做很多关于字符串的题了!
代码——Code
建议复制到自己的编程软件上看
/* Problem: JZOJ1598(询问一个字符串中有多少至少出现两次的子串) Content: SA's Code and Explanation Author : YxuanwKeith*/#include &cstdio&
#include &cstring&
#include &algorithm&
usingnamespacestd;
constintMAXN = 100005;
charch[MAXN], All[MAXN];
intSA[MAXN], rank[MAXN], Height[MAXN], tax[MAXN], tp[MAXN], a[MAXN], n, charstr[MAXN];//rank[i] 第i个后缀的排名; SA[i] 排名为i的后缀位置;
// Height[i] 排名为i的后缀与排名为(i-1)的后缀的LCP//tax[i]
//计数排序辅助数组; tp[i] rank的辅助数组(计数排序中的第二关键字),与SA意义一样。
//a为原串voidRSort() { //rank第一关键字,tp第二关键字。for(inti = 0; i &= i ++) tax[i] = 0;
for(inti = 1; i &= i ++) tax[rank[tp[i]]] ++;
for(inti = 1; i &= i ++) tax[i] += tax[i-1];
for(inti = i &= 1; i --) SA[tax[rank[tp[i]]] --] = tp[i];
//确保满足第一关键字的同时,再满足第二关键字的要求}
//计数排序,把新的二元组排序。
ntcmp(int*f, intx, inty, intw)
{ returnf[x] == f[y] && f[x + w] == f[y + w]; } //通过二元组两个下标的比较,确定两个子串是否相同
voidSuffix() { //SAfor(inti = 1; i &= i ++) rank[i] = a[i], tp[i] = m = 127,RSort(); //一开始是以单个字符为单位,所以(m = 127)for(intw = 1, p = 1, p & w += w, m = p)
{ //把子串长度翻倍,更新rank//w 当前一个子串的长度; m 当前离散后的排名种类数//当前的tp(第二关键字)可直接由上一次的SA的得到for(p = 0, i = n - w + 1; i &= i ++) tp[++ p] =
//长度越界,第二关键字为0for(i = 1; i &= i ++) if(SA[i] & w) tp[++ p] = SA[i] -
//更新SA值,并用tp暂时存下上一轮的rank(用于cmp比较)RSort(), swap(rank, tp), rank[SA[1]] = p = 1;
//用已经完成的SA来更新与它互逆的rank,并离散rankfor(i = 2; i &= i ++) rank[SA[i]] = cmp(tp, SA[i], SA[i - 1], w) ? p : ++ }
//离散:把相等的字符串的rank设为相同。//LCPintj, k = 0; for(inti = 1; i &= Height[rank[i ++]] = k) for( k = k ? k - 1: k, j = SA[rank[i] - 1];
a[i + k] == a[j + k]; ++ k);
//这个知道原理后就比较好理解程序}
voidInit() { scanf("%s", str); n = strlen(str);
for(inti = 0; i & i ++) a[i + 1] = str[i];}intmain() { Init(); Suffix(); intans = Height[2];
for(inti = 3; i &=
i ++) ans += max(Height[i] - Height[i - 1], 0);
printf("%dn", ans); }
4个比较基础的应用
Q1:一个串中两个串的最大公共前缀是多少?
A1:这不就是Height吗?用rmq预处理,再O(1)查询。
Q2:一个串中可重叠的重复最长子串是多长?
A2:就是求任意两个后缀的最长公共前缀,而任意两个后缀的最长公共前缀都是Height 数组里某一段的最小值,那最长的就是Height中的最大值。
Q3:一个串种不可重叠的重复最长子串是多长?
A3:先二分答案,转化成判别式的问题比较好处理。假设当前需要判别长度为k是否符合要求,只需把排序后的后缀分成若干组,其中每组的后缀之间的Height 值都不小于k,再判断其中有没有不重复的后缀,具体就是看最大的SA值和最小的SA值相差超不超过k,有一组超过的话k就是合法答案。
A4:一个字符串不相等的子串的个数是多少?
Q4:每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数。而且可以发现每一个后缀Suffix[SA[i]]的贡献是Len - SA[i] + 1,但是有子串算重复,重复的就是Heigh[i]个与前面相同的前缀,那么减去就可以了。最后,一个后缀Suffix[SA[i]]的贡献就是Len - SA[k] + 1 - Height[k]。
对于后缀数组更多的应用这里就不详细阐述,经过思考后每个人都会发现它的一些不同的用途,它的功能也许比你想象中的更强大!
最开始的那道题
先搬下来。。。
你可想想这道题:你有一个01串S,然后定义一个前缀最右边的位置就是这个前缀的结束位置。现在有很多个询问,每q个询问结束位置在l~r中不同前缀的最长公共后缀是多长?
|S|,q≤100000
简单思路:首先可以把字符串反过来就是求后缀的最长公共前缀了,可以用SA求出height数组,然后用rmq预处理之后就是求两个位置间的最小值。然后对于一个区间,显然只有在SA数组中相邻的两个串可以贡献答案。
对于区间询问的问题可以用莫队处理,然后考虑加入一个后缀应该怎么处理,我们可以维护一个按SA数组排序的链表。假设我们先把所有位置的SA全部加入,然后按顺序删除,重新按顺序加入时就可以O(1)完成修改。那么按照这个思路我们可以用固定左端点的并查集,做到只加入,不删除,然后用O(nn√+nlogn)的复杂度完成这道题。
*可能后面的处理方式比较麻烦,如果直接用splay维护区间中的后缀的话可以做到O(nn√logn),这个方法就比较直观,而SAM在个问题上还是有点无力的。这题只是为了说明SA相比于SAM还是有他的独到之处,特别是在处理后缀的lcp之类的问题上。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。欢迎来到慢慢买! &
扫描二维码下载客户端
慢慢买客户端
数据来源:全网公开的评论和销量数据
单反镜头十大品牌排行,来看看单反镜头什么牌子好?
排名主要依据全网销量和口碑
(十大单反镜头品牌,Canon/佳能)&
(十大单反镜头品牌,Nikon/尼康)&
(十大单反镜头品牌,SONY/索尼)&
(十大单反镜头品牌,TAMRON/腾龙)&
(十大单反镜头品牌,SAMSUNG/三星)&
(十大单反镜头品牌,SIGMA/适马)&
(十大单反镜头品牌,OLYMPUS/奥林巴斯)&
(十大单反镜头品牌,PENTAX/宾得)&
(十大单反镜头品牌,Panasonic/松下)&
(十大单反镜头品牌,FUJIFILM/富士)&
佳能50mm F1.8的镜头的直径为68.2mm,镜头长度为41mm,最近对焦距离约0.45米,是性价比很高的人像镜头。此外,其重量只有130克,便携性很强。俺拿到的这只头,镜面上有块黄豆大小的五彩斑,试拍了下,不影响成像,暂时不换了,用着吧。光圈1.8时有跑焦现象较明显,其他焦段,如距离掌握不好的话,图像边缘跑焦,安装镜头时有些紧。本人将其装在100D上使用,比例非常协调,不会像某些大变焦头,出现头重脚轻的情况。
如将此头安装在佳能APS-C画幅数码单反上,可以作为一支80mm大光圈镜头使用,比较适合拍摄人像作品,主体锐利,背景虚化效果不错。但拍风景则构图完全靠走。这只镜头在全开光圈下的前提下,成像质量还可以接受,但是继续放小光圈的话,将会获得更为理想的成像。将该镜头的光圈开到最大F1.8时,边缘成像有些松散,中央成像的锐度也不高;将光圈略微的收缩两档后,这种现象就好转很多;据网上推荐该镜头的最佳光圈为F4,可以获得较为不错的画质表现(本人晒单照片大部分是采用的2.8)。
相对于600元的价位来说它没什么缺点,如果非要找毛病,那就是镜头的做工一般,它采用全塑料镜头筒,耐用性上稍微差了一些。还有就是对焦声音略大。
用户 戴***雀 于
发布的评价
优点机身40D,试过各个光圈,均没有跑焦现象,另外这是新款,支持调焦,跑焦也不怕,17mm广角拍风景也不错了,要超广角就不要选半幅机,17端最大2.8光圈,光圈全开暗角控制非常不错,比佳能狗头好多了,收到3.5-5.6基本上不会很明显,2.8的锐度就不错了,全开光圈锐利;30-50焦段光圈为3.5-4,这一焦段光圈全开基本无暗角,锐度也比狗头要好得多,50端F4可用,能达到佳能L头的80%左右,收到5.6成像非常的不错了,虚化效果比不上小痰盂,但画质,色彩都比小痰盂好,9片光圈,焦外虚化非常好看;70端F4可用,光圈全开锐度照样很高,焦外虚化柔美,画质油润,超过佳能老款17-85,收到5.6可与佳能15-85的70焦段相当; OS防抖4级应该不到,3级肯定达到的; 70端微距1:2.8,效果非常牛,最近拍摄距离几乎可以贴到镜头上了,景深堪比1.4的光圈啊,不过只适合拍拍花草,小动物什么的就不太可能了,毕竟离远了效果就大大打折了!HSM对焦安静迅速,没用过USM,不予评价,差也差不了多远;变焦环阻尼稍大,镜头前端绝对不会滑出的;适马的新图层,手感非常好,从质感上来说,用久了也不会掉漆;72的缺点此头是外对焦,对焦环非常容易打手,刚开始用的要慢慢习惯!变焦尼阻稍大,变焦行程稍短!50端光圈稍小,能到3.5就好了!总结要是能全程2.8的光圈,那就NB了,不过当F4使用也无大碍,非常适合做挂机头,加上适马的10-20,70-200,基本上就不用再买其他镜头了,PS:适马的50 1.4佳能口跑焦始终是个心病!
用户 追***人 于
发布的评价
这是一支性价比极高的大光圈防抖残幅挂机标头 在佳能机上35mm等效焦距约为27~80mm 有小广角可以风景 扭到21mm可以拍人文 扭到50mm可以拍人像 焦段可用性极高。有超声波马达 光线充足时对焦可以说是快准狠,不输原厂USM 但对焦声还是有且对焦环会动 刚开始不适应会打手 但用久了习惯就不会了。镜头总体做工也算可以 毕竟才两千。。金环很拉风。画质方面光圈2.8全开可用,暗光下优势明显,暗角不明显 畸变也很轻微,全开时中心成像很锐利但边缘有点肉,收小2档光圈后整个画面就很锐利,同光圈下无论是锐度色散畸变还是画质完爆18135套机镜,出片的色彩比套机镜头要好要浓郁,光圈f8整个画面锐利如刀削,画面每个地方都极其清晰。变焦环尼阻非常顺手 不会像18135套机镜那样太滑,也不会太难拧。另外在50mm端也可以拍个小微距。总的来说是支非常值得入手的残幅标头 收小光圈画质不输廉价红圈的出片
用户 a***c 于
发布的评价
重量仅为约130克的标准定焦镜头,非常小型轻量。从外部结构到卡口部分均为工程塑料构成,从而实现了镜头整体的大幅轻量化。简洁的5组6片镜头光学结构,采用传统的高斯光学设计。作为一款重视性价比的镜头,可实现较高的成像性能,而且从最大光圈开始,整个画面内即可获得锐利的成像。很少出现色像差,其成像性能可与上一级镜头媲美。虽然与最大光圈F1.2和F1.4的镜头相比,其虚化程度稍逊一筹,但锐度仍可与前两者相匹敌。最近对焦距离约为0.45米,适于近距离拍摄。搭配APS-C画幅相机,可获得相当于约80mm焦距的视角,能够实现近似于微距的特写拍摄效果。不但拥有十分适于抓拍和人像摄影的焦距,而且小巧轻便,外拍时与变焦镜头搭配也不显累赘。虽然与已有变焦镜头的焦段相重合,却能展现出不同的成像风格。适合作为入门镜头使用,但它同时也具备了满足高级用户较高要求的实力。
用户 i***c 于
发布的评价
整体做工作为副厂头非常好,唯一不足就是细节变焦环在前端和原厂刚好相反,结果导致遮光罩反装的时候不能使用变焦环,不知道是为了和原厂头区别还是专利所致,个人感觉不科学也不太好用。镜头上的脚架环用料十足,看外形就感觉非常可靠。之前用过尼康原厂80-200mm2.8G,感觉腾龙这只头肯定是技术完全压过了的(这样比较不太公平,但是同价位比较就非常有优势了)。
镜头质感不错,全金属的头重量对于2.8的光圈来说不算过分,1.5kg加上D800机身的重量时间长了也是不小的负担,不过这样的头平时不会成为挂机头。只有出去拍摄红叶之类的时候才有特别的需要,就是属于带着后悔(用的少),不带也后悔(没有长焦很多虚化效果拍不出来)。
人像色彩还原不错,颜色比较接近佳能相机拍摄人像的感觉(偏暖),和所有大变焦一样70端边缘会略有桶装畸变,拍美女如果在非中心区域脸会显胖(只有定焦解决),200端畸变会好很多。最后三张照片分别是200mm,200端100%放大后细节,70mm。
因为之前有原厂80-200mm的确用的很少,所以没有纠结原厂还是副厂头,效果和性价比都很高的镜头,成像锐色彩还原也很好!不过没有严格在室外环境下测试,一点感受供大家分享!
用户 木***虫 于
发布的评价
全网有60930人评论
全网有52886人评论
全网有13377人评论
全网有32275人评论
全网有43285人评论
全网有46664人评论
全网有12529人评论
全网有12841人评论
密封包装,感觉还可以,希望未来质量不会出问题
用户 a***3 于
发布的评价
刚刚收到,高大上,不错不错,
用户 -***- 于
发布的评价
棒棒哒很喜欢虚化很强
用户 ***i 于
发布的评价
大眼睛很透彻! 晚上装到D810上试拍了两张,有合焦提示,支持A档,P档,不错!
用户 海***子 于
发布的评价
性价比超高,重量轻,便于携带,柔化效果还算不错,虽说是入门镜头,但品控还是有提升空间
用户 飘***虹 于
发布的评价
对焦准确,速度快。镜头轻才是我的选择。定焦的画质比变焦镜头好的不是一点点。这款最近对焦太完美了。很好的一只镜头,完美的一次购物。
用户 探***8 于
发布的评价
等了半个月终于有货了,专人送到家,现在贵的东西都这样送吗?镜头全新,试了下基本满意
用户 s***i 于
发布的评价
共有8016条记录
当前为1/729页,每页11条记录 & 首页& 上一页& & & 跳转:
单反镜头相关信息
单反镜头口碑排行榜
最低价:¥8280
最低价:¥980
最低价:¥1134
最低价:¥1638
最低价:¥1413
最低价:¥1570
扫描下载慢慢买APP
全网比价 省钱专家
&隐藏对比框
对不起,您还没有选择产品麦子与谷子的喜欢 | LOFTER(乐乎) - 让兴趣,更有趣
LOFTER for ipad —— 让兴趣,更有趣
麦子与谷子 的喜欢
&nbsp&nbsp被喜欢
&nbsp&nbsp被喜欢
{list posts as post}
{if post.type==1 || post.type == 5}
{if !!post.title}${post.title|escape}{/if}
{if !!post.digest}${post.digest}{/if}
{if post.type==2}
{if post.type == 3}
{if !!post.image}
{if post.type == 4}
{if !!post.image}
{if !!photo.labels && photo.labels.length>0}
{var wrapwidth = photo.ow < 500?photo.ow:500}
{list photo.labels as labs}
{var lbtxtwidth = Math.floor(wrapwidth*(labs.ort==1?labs.x:(100-labs.x))/100)-62}
{if lbtxtwidth>12}
{if !!labs.icon}
{list photos as photo}
{if photo_index==0}{break}{/if}
品牌${make||'-'}
型号${model||'-'}
焦距${focalLength||'-'}
光圈${apertureValue||'-'}
快门速度${exposureTime||'-'}
ISO${isoSpeedRatings||'-'}
曝光补偿${exposureBiasValue||'-'}
镜头${lens||'-'}
{if data.msgRank == 1}{/if}
{if data.askSetting == 1}{/if}
{if defined('posts')&&posts.length>0}
{list posts as post}
{if post_index < 3}
{if post.type == 1 || post.type == 5}
{if !!post.title}${post.title|escape}{/if}
{if !!post.digest}${post.digest}{/if}
{if post.type == 2}
{if post.type == 3}
{if post.type == 4}
{if post.type == 6}
{if drlist.length>0}
更多相似达人:
{list drlist as dr}{if drlist.length === 3 && dr_index === 0}、{/if}{if drlist.length === 3 && dr_index === 1}、{/if}{if drlist.length === 2 && dr_index === 0}、{/if}{/list}
暂无相似达人,
{if defined('posts')&&posts.length>0}
{list posts as post}
{if post.type == 2}
{if post.type == 3}
{if post.type == 4}
{if post.type == 6}
this.p={ dwrMethod:'queryLikePosts',fpost:'',userId:,blogListLength:30};}

我要回帖

更多关于 头上有包 按起有点疼 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信