用了近两周的时间,终于把罗神那篇后缀数组应用看完了,题目也写了一遍,T了无数次...详见前几篇博文...

后缀数组很重要的是那个height数组,可以用来做各种奇奇怪怪的东西...常用方法去是去二分,比较少见的是单调栈维护...明天把切的12道题题型整理归纳后再补在后面吧,有点晚了...明天复习AC自动机去!

预备:最长公共前缀

对于suffix(i)和suffix(j) 假设rank[i]<rank[j] 那么lcp(i,j)=min{height[k]| rank[i]+1<=k<=rank[j]}
一、分组+二分长度:
  1.不可重叠最长重复子串 (poj1743)
    二分长度k,将heigh[i]>=k的分为一组..然后对于这组后缀,我们记录其sa[i]的最大值和最小值,若最大值与最小值之差不小于k,那么长度k成立..
  2.可重叠的 k 次最长重复子串(poj3261)
    同上一道题,二分长度,判断一组的后缀个数不少于k即可..
  3.不小于 k 个字符串中的最长子串(poj3294)
    二分长度,分组。分组中判断k个:将字符串染色,然后用布尔数组判断是否出现在多个字符串即可...
  4.每个字符串至少出现两次且不重叠的最长子串(spoj220)
    依旧二分长度,分组。对于一组后缀,长度为len,我们判断是否满足每一个字符串都有出现两次,且两次出现的sa[i]>=len..所以记录每个串的最小值和最大值即可...
  5.出现或反转后出现在每个字符串中的最长子串(poj1226)
    和1的做法差不多..染色的时候把反转后的字符串染成一样的就行..

二、暴力枚举:
  1.可重叠最长重复子串
    子串出现2次或以上,也就是找到最大的height值即可..
  2.不相同的子串的个数(spoj694,spoj705)
    每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数...然后对于suffix(sa[i]),将产生n-sa[i]+1个前缀,用height数组去重即可..
  3.最长回文子串(ural 1297)
    分长度为奇数和偶数...将原串翻转后扔在后面,中间插一个辨别字符,一般用比所有字符小的字符..
    枚举每个字母作为回文串中心:
      (1)奇数:最长回文串为lcp(i,len-i+1)*2-1
      (2)偶数:最长回文串为lcp(i,len-i+2)*2 (i=1时不成立)
  4.连续重复子串(poj2406)
    枚举k,判断lcp(1,k+1)是否等于n-k...预处理一下达到O(1)查询即可..
  5.最长公共子串(poj2774,ural 1517)
    枚举height[i],判断sa[i],sa[i-1]是否不属于同一个字符串,不属于则height[i]可计入答案..
三、有技巧的枚举、单调栈
   1.重复次数最多的连续重复子串(spoj687 poj3693)
     详见:http://www.cnblogs.com/EC-Ecstasy/p/4172751.html
   2.长度不小于 k 的公共子串的个数 (poj3415)
     单调栈O(n)维护...详见:http://www.cnblogs.com/EC-Ecstasy/p/4174671.html

【距离GDOI:131天】 后缀数组完毕的更多相关文章

  1. 【距离GDOI:136天】 后缀数组中...

    当时后缀数组没有好好学...各种应用都没学,这两天好好补,要把罗神的论文好好研究一遍...其实后缀数组真的好神奇!!特别是那个萌萌的height数组! 今天终于能有两节完整的晚自修了QAQ...明晚还 ...

  2. 【知识总结】后缀数组(Suffix_Array)

    又是一个学了n遍还没学会的算法-- 后缀数组是一种常用的处理字符串问题的数据结构,主要由\(sa\)和\(rank\)两个数组组成.以下给出一些定义: \(str\)表示处理的字符串,长度为\(len ...

  3. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  4. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  5. hihoCoder 后缀数组 重复旋律

    #1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...

  6. 后缀数组:倍增法和DC3的简单理解

    一些定义:设字符串S的长度为n,S[0~n-1]. 子串:设0<=i<=j<=n-1,那么由S的第i到第j个字符组成的串为它的子串S[i,j]. 后缀:设0<=i<=n- ...

  7. hiho一下123周 后缀数组四·重复旋律

    后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...

  8. 后缀数组 & 题目

    后缀数组被称为字符串处理神器,要解决字符串问题,一定要掌握它.(我这里的下标全部都是从1开始) 首先后缀数组要处理出两个数组,一个是sa[],sa[i]表示排名第i为的后缀的起始位置是什么,rank[ ...

  9. 2016暑假多校联合---Substring(后缀数组)

    2016暑假多校联合---Substring Problem Description ?? is practicing his program skill, and now he is given a ...

随机推荐

  1. 转:mysql远程连接 Host * is not allowed to connect to this MySQL server

    在本机登入mysql后,更改"mysql"数据库里的"user"表里的"host"项,从"localhost"改为'%' ...

  2. pip安装第三方包总失败

    第一步:升级pip python -m pip install -U pip 第二布:安装想下载的第三方包 python -m pip install xx 一般来说pip安装不会失败的,失败的话就尝 ...

  3. javascript遍历方法总结

    forEach 循环 JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.lengt ...

  4. Linux下MySQL安装及配置

    Linux下MySQL安装及配置 安装MySQL Ubuntu系统中,直接使用apt install的方式去安装MySQL的服务端和客户端,MySQL的客户端必须安装,否则无法通过命令连接并操作MyS ...

  5. PHP.22-Smart模版

    Smart模版 smarty是一个基于PHP开发的PHP模板引擎.它提供了逻辑与外在内容的分离,简单的讲,目的就是要使PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美 ...

  6. javaScript对SEO的影响

    在两大搜索引擎阵营中,大量实践证明百度对JAVASCRIP的处理很不理想而GOOGLE的处理要好一些.   网页中出现大量的JavaScript会给搜索引擎爬行增加难度.其主要影响有以下几点: 1.干 ...

  7. Maven学习 (三) 使用m2eclipse创建web项目

    1.首先确认你的eclipse已经安装好m2eclipse的环境,可以参照上两篇Maven学习内容 2.新建一个maven的项目 3.下一步默认配置,使用默认的工作空间,或者你可以自己选择其他的空间 ...

  8. Eclipse 创建 Java 包---Eclipse教程第09课

    打开新建 Java 包向导 你可以使用新建 Java 包向导来创建 Java 包.Java 包向导打开方式有: 通过点击 "File" 菜单并选择 New > Package ...

  9. Fiddler - 使用教程

    1.断点调试,修改请求表单和响应数据 命令介绍: bpu在请求开始时中断,bpafter在响应到达时中断,bps在特定http状态码时中断,bpv/bpm在特定请求method时中断. bpu m.t ...

  10. js和CSS3炫酷3D相册展示

    <!doctype html> <html> <head> <meta charset="UTF"> <title>js ...