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 ...
随机推荐
- 【C++自我精讲】基础系列六 PIMPL模式
[C++自我精讲]基础系列六 PIMPL模式 0 前言 很实用的一种基础模式. 1 PIMPL解释 PIMPL(Private Implementation 或 Pointer to Implemen ...
- Lucene7.2.1系列(三)查询及高亮
系列文章: Lucene系列(一)快速入门 Lucene系列(二)luke使用及索引文档的基本操作 Lucene系列(三)查询及高亮 一 准备 创建项目并添加Maven依赖 <dependenc ...
- discuz 积分按日重新计算,(摒弃以前24小时计算)
修改\source\module\forum\forum_misc.php将 foreach(C::t('forum_ratelog')->fetch_all_sum_score($_G['ui ...
- 获取网站所有的url正则表达式
C# string pattern1 = @"(?is)<[^>]*?src=(['""\s]?)(?<src>[^'""\s ...
- SQLserver连接本地服务器
1.打开SQLserver “连接到服务器” 2.服务器类型:数据库引擎 3.服务器名称:浏览更多->本地服务器->数据库引擎->选择本地服务器 4.身份验证:windows验证 5 ...
- Java network programming-guessing game
猜数字游戏 游戏的规则如下: 当客户端第一次连接到服务器端时,服务器端生产一个[0,50]之间的随机数字,然后客户端输入数字来猜该数字,每次客户端输入数字以后,发送给服务器端,服务器端判断该客户端发送 ...
- 重置HTML标签样式
;;} header,footer,section,article,aside,nav,hgroup,address,figure,figcaption,menu,details{display:bl ...
- beego学习笔记(4):开发文档阅读(1)
1.beego的设计是高度模块化的.每个模块,都可以单独使用.一共八大模块: cache;session;log;orm;context;httplibs;toolbox 2.beego的执行逻辑 3 ...
- android 代码设置、打开wifi热点及热点的连接(转)
用过快牙的朋友应该知道它们在两天设备之间传输文件的时候使用的是wifi热点,然后另一台便连接这个热点再进行传输.快牙传输速度惊人应该跟它的这种机制有关系吧.不知道它的搜索机制是怎样的,但我想应该可 ...
- IEEEXtreme 10.0 - Food Truck
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme10.0 - Food Truck 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.c ...