第一道后缀数组

后缀数组要维护三个数组: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. KEA128单片机启动代码分析

    ;/*****************************************************************************; * @file: startup_SK ...

  2. koa通过get请求获取参数

    1.通过get方式请求获取参数的方式有两种 通过上下文获取 通过request获取 获得的格式有两种:query与querystring 注意:querystring为小写,驼峰格式会导致无法获取 2 ...

  3. python进阶之py文件内置属性

    前言 对于任何一个python文件来说,当python解释器运行一个py文件,会自动将一些内容加载到内置的属性中:一个模块我们可以看做是一个比类更大的对象. 查看模块的内置属性 我们先创建一个典型的p ...

  4. python模块分析之sqlite3数据库

    SQLite作为一种应用广泛的文件式关系型数据库,python操作sqlite主要有两种方式,原生SQL语句和ORM映射工具. SQLAlchemy连接SQLITE SQLAlchemy是一款优秀的p ...

  5. 64_t5

    texlive-mkpattern-svn15878.1.2-33.fc26.2.noarch..> 24-May-2017 15:54 38178 texlive-mkpic-bin-svn3 ...

  6. 大数据系列之kafka-java实现

    Java源码GitBub地址: https://github.com/fzmeng/kafka-demo 关于kafka安装步骤可见文章   http://www.cnblogs.com/cnmeng ...

  7. Codeforces Round #453 (Div. 1)

    Codeforces Round #453 (Div. 1) A. Hashing Trees 题目描述:给出一棵树的高度和每一层的节点数,问是否有两棵树都满足这个条件,若有,则输出这两棵树,否则输出 ...

  8. 【UOJ#38】【清华集训2014】奇数国

    考虑欧拉函数的性质,60很小,压位存下线段树每个节点出现质数. #include<bits/stdc++.h> ; ; typedef long long ll; using namesp ...

  9. html 简单学习

    通过记事本,依照以下四步来创建您的第一张网页. 步骤一:启动记事本 如何启动记事本: 开始    所有程序        附件            记事本 步骤二:用记事本来编辑 HTML 在记事本 ...

  10. 一键去除网页BOM属性【解决乱码,头部空白,&#65279问题】

    几个常出现的问题: 1.网站打开空白 2.页面头部出现多余的空白 3.网站出现乱码,如“锘�” 解决方法可以是: 1.选用专业的编辑器,例如notepad++,sublime,editplus这样不会 ...