bzoj 2251
第一道后缀数组
后缀数组要维护三个数组: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的更多相关文章
- bzoj 2251: [2010Beijing Wc]外星联络 后缀数组
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 424 Solved: 232[Submit][ ...
- ●BZOJ 2251 [2010Beijing Wc]外星联络
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解: 后缀数组,倍增,RMQ 题意:把重复次数超过 1次的子串按字典序输出它们重复的 ...
- BZOJ 2251: [2010Beijing Wc]外星联络
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 795 Solved: 477[Submit][ ...
- bzoj 2251: 外星联络 后缀Trie
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解 本来以为这道题应该从01序列的性质入手 结果就想歪了 等自己跳出了01序列这个 ...
- bzoj 2251: [2010Beijing Wc]外星联络【SA】
先求SA,然后按字典序从小到大枚举子串,每到一个后缀从长到短枚举子串(跳过长为he[i]的和前一段重复的子串),然后维护一个点p,保证i~p之间最小的he>=当前枚举长度,p是单调向右移的 然后 ...
- 外星联络(bzoj 2251)
Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息. ...
- BZOJ 2251 Trie树
思路: i~n加到Trie树里 经过的边权+1 DFS一遍 搞定~ //By SiriusRen #include <cstdio> #include <cstring> #i ...
- Week Four
2018.12.18 1.[USACO Platinum C] 2.[Gym 102028H] 3.[BZOJ 2750] 4.[BZOJ 3238] 5.[BZOJ 4310] 6.[BZOJ 38 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
随机推荐
- javaScript语法和风格的检查工具
一.JSLint. JSHint. JSCS. ESLint 1.JSLint是由Douglas Crockford开发的,可能是最早的JavaScript Lint工具.JSLint定义了一组编码约 ...
- 网络抓包wireshark(转)
下载地址:https://www.wireshark.org/download/win64/ 抓包应该是每个技术人员掌握的基础知识,无论是技术支持运维人员或者是研发,多少都会遇到要抓包的情况,用过 ...
- 2-Python基础语法-内存管理-运算符-程序控制
目录 1 Python 基础语法 1.1 注释 1.2 缩进 1.3 续行 1.4 标识符 1.5 转义序列 1.6 数字 1.7 字符串 1.8 其他 2 Python 运算符 2.1 赋值运算符 ...
- 【转载】selenium之 定位以及切换frame(iframe)
更多关于python selenium的文章,请关注我的专栏:Python Selenium自动化测试详解 总有人看不明白,以防万一,先在开头大写加粗说明一下: frameset不用切,frame需层 ...
- Machine Learning系列--判别式模型与生成式模型
监督学习的任务就是学习一个模型,应用这一模型,对给定的输入预测相应的输出.这个模型的一般形式为决策函数:$$ Y=f(X) $$或者条件概率分布:$$ P(Y|X) $$监督学习方法又可以分为生成方法 ...
- selenium启动chrome模拟器模拟手机
一.如果chrome选项里边有这个模拟设备(比如iPhone 6 Plus): 1.先启动Selenium Grid, 比如命令:java -jar selenium-server-standalon ...
- ansible安装配置及最佳实践roles
ansible是什么? ansible是一款轻量级配置管理工具,用于远程批量部署.安装.配置.类似的还有puppet.saltstack,各有所长,任君自选. 官方文档:http://docs.ans ...
- 提高spring boot jpa性能(译)
Spring Data JPA为Spring应用程序提供了数据访问层的实现.这是一个非常方便的组件,因为它不会重新发明每个新应用程序的数据访问方式,因此您可以花更多时间来实现业务逻辑.使用Spring ...
- C# 随笔 【ToList().Foreach()和Foreach()】
1. 最近在做一个Socket通讯的例子,但是如果使用UTF-8编码传输中文的话取和的会不一样.早上做了测试 . string str = "a我..";看代码中间是一个英文,一个 ...
- alias命令别名
笔者在看<鸟哥私房菜>时,突然看到这个命令,之前未接触过,故简单记录学习下,具体的大家可参见man手册.功能说明:设置指令的别名.语 法:alias[别名]=[指令名称]参 数 :若不加任 ...