第一道后缀数组

后缀数组要维护三个数组:sa(suffix array), rk(rank)和ht(height)。

含义分别是:

sa[i]:将后缀按照字典序排序后,第i大的后缀的起始位置。

rk[i]:起始位置为i的后缀的排名。

ht[i]:起始位置为i的后缀与排名为rk[i]-1的后缀的最长公共前缀。

对于任意一个字串,一定是某个后缀的前缀。

然后从sa[1]开始,统计字串,每个后缀sa[i]的可能的字串的个数(不与前面统计的重复)是:n-sa[i]+1-ht[sa[i]]

然后就这羊枚举子串,幷向后暴力统计个数,这样还能保证字典序是从小到大。

 /**************************************************************
Problem: 2251
User: idy002
Language: C++
Result: Accepted
Time:240 ms
Memory:892 kb
****************************************************************/ #include <cstdio>
#define maxn 3010 int n;
int aa[maxn];
int sa[][maxn], rk[][maxn], ht[maxn], vv[maxn], p;
char str[maxn]; void expand( int k, int sa[maxn], int rk[maxn], int tsa[maxn], int trk[maxn] ) {
for( int i=; i<=n; i++ ) vv[rk[sa[i]]]=i;
for( int i=n; i>=; i-- ) if( sa[i]>k ) tsa[vv[rk[sa[i]-k]]--]=sa[i]-k;
for( int i=n-k+; i<=n; i++ ) tsa[vv[rk[i]]--]=i;
for( int i=; i<=n; i++ ) trk[tsa[i]]=trk[tsa[i-]]+(rk[tsa[i]]!=rk[tsa[i-]]||rk[tsa[i]+k]!=rk[tsa[i-]+k]);
}
void makeht() {
int k=;
ht[sa[p][]] = ;
for( int i=; i<=n; i++ ) {
if( rk[p][i]== ) continue;
int j=sa[p][rk[p][i]-];
while( aa[i+k]==aa[j+k] ) k++;
ht[i] = k;
if( k> ) k--;
}
}
void suffix() {
p=;
for( int i=; i<=n; i++ ) vv[aa[i]]++;
for( int i=; i<=; i++ ) vv[i]+=vv[i-];
for( int i=n; i>=; i-- ) sa[p][vv[aa[i]]--]=i;
for( int i=; i<=n; i++ ) rk[p][sa[p][i]]=rk[p][sa[p][i-]]+(aa[sa[p][i]]!=aa[sa[p][i-]]);
for( int k=; k<n; k<<=,p=-p ) expand( k, sa[p], rk[p], sa[-p], rk[-p] );
makeht();
} int main() {
scanf( "%d", &n );
scanf( "%s", str+ );
for( int i=; i<=n; i++ )
aa[i] = str[i]-''+;
suffix();
for( int i=; i<=n; i++ ) {
for( int t=sa[p][i]+ht[sa[p][i]]; t<=n; t++ ) {
int cnt=;
for( int j=i+; j<=n && ht[sa[p][j]]>=(t-sa[p][i]+); j++,cnt++);
if( cnt> )
printf( "%d\n", cnt );
}
}
}

bzoj 2251的更多相关文章

  1. bzoj 2251: [2010Beijing Wc]外星联络 后缀数组

    2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 424  Solved: 232[Submit][ ...

  2. ●BZOJ 2251 [2010Beijing Wc]外星联络

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解: 后缀数组,倍增,RMQ 题意:把重复次数超过 1次的子串按字典序输出它们重复的 ...

  3. BZOJ 2251: [2010Beijing Wc]外星联络

    2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 795  Solved: 477[Submit][ ...

  4. bzoj 2251: 外星联络 后缀Trie

    题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解 本来以为这道题应该从01序列的性质入手 结果就想歪了 等自己跳出了01序列这个 ...

  5. bzoj 2251: [2010Beijing Wc]外星联络【SA】

    先求SA,然后按字典序从小到大枚举子串,每到一个后缀从长到短枚举子串(跳过长为he[i]的和前一段重复的子串),然后维护一个点p,保证i~p之间最小的he>=当前枚举长度,p是单调向右移的 然后 ...

  6. 外星联络(bzoj 2251)

    Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息. ...

  7. BZOJ 2251 Trie树

    思路: i~n加到Trie树里 经过的边权+1 DFS一遍 搞定~ //By SiriusRen #include <cstdio> #include <cstring> #i ...

  8. Week Four

    2018.12.18 1.[USACO Platinum C] 2.[Gym 102028H] 3.[BZOJ 2750] 4.[BZOJ 3238] 5.[BZOJ 4310] 6.[BZOJ 38 ...

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

随机推荐

  1. MyBatis数据库字段和实体对象属性名不一致的解决方案

    数据库和对象的属性名不一致是很常见的问题,这个时候依从表字段到对象属性名的按名称匹配映射已经搞不定这个了,下面是几种解决方案. 1. 开启驼峰转换 如果数据库中的字段名与对象只是简单的不一致的话,比如 ...

  2. android Timer TimerTask用法笔记

    Android中经常会遇到执行一些周期性定时执行的任务.初学的时候经常会使用Thread.sleep()方法.在android中,有Timer可以专门干这个事情. 先看看Timer.class中都是些 ...

  3. javascript中的数组去重

    1.方法一:双层循环,外层循环元素,内层循环做比较,若相同则跳过,不同则加入结果集中,获取没重复的最右侧的值放入数组中 Array.prototype.distinct = function(){ v ...

  4. Java线上应用故障排查之一:高CPU占用【转】

    近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下. 方法一: 转载:http://www.linuxhot.com/java-cpu-used-high.htm ...

  5. 【IT公司笔试面试】75道逻辑推理题及答案

    [1]假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. 由满6向空5倒,剩1升,把这1升倒5里,然后6剩满,倒5里面,由于5里面有 ...

  6. 制作自动化系统安装U盘

    1.挂载CentOS6.6镜像 [root@test88 ~]# mkdir /application/tools -p [root@test88 ~]# cd /application/tools/ ...

  7. java.lang.IllegalArgumentException: Page directive: invalid value for import

    我的项目原来用的tomcat版本是apache-tomcat-7.0.53,后来为了安全原因将版本升至\apache-tomcat-7.0.57,发现有的jsp页面出现下面的异常: java.lang ...

  8. effective c++读书笔记(一)

    很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.3 ...

  9. 记一次java内存溢出的解决过程

    注:本文主要记录这次解决内存溢出问题的过程而不是具体问题. 最近在写一个搜索引擎,使用倒排索引结构进行文档检索,保存索引的基本思想是先将倒排列表保存到内存中一个有序Map里(TreeMap),然后当内 ...

  10. 【数据挖掘基础算法】KNN最近邻分类算法

    算法简介: 通过计算待预测样本和已知分类号的训练样本之间的距离来判断该样本属于某个已知分类号的概率.并选取概率最大的分类号来作为待预测样本的分类号 懒惰分类算法,其模型的建立直到待预测实例进行预测时才 ...