2251: [2010Beijing Wc]外星联络

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 801  Solved: 481
[Submit][Status][Discuss]

Description

小 P 在看过电影《超时空接触》(Contact)之后被深深的打动,决心致力于寻
找外星人的事业。于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星
人发来的信息。虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高
低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在
其中。他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以
他希望找到他接受到的 01 串中所有重复出现次数大于 1 的子串。但是他收到的
信号串实在是太长了,于是,他希望你能编一个程序来帮助他。

Input

输入文件的第一行是一个整数N ,代表小 P 接收到的信号串的长度。 
输入文件第二行包含一个长度为N 的 01 串,代表小 P 接收到的信号串。

Output

输出文件的每一行包含一个出现次数大于1 的子串所出现的次数。输出的顺
序按对应的子串的字典序排列。

Sample Input

7
1010101

Sample Output

3
3
2
2
4
3
3
2
2

HINT

对于 100%的数据,满足 0 <=  N     <=3000

Source

//后缀数组搞sa,height,对于每个i,枚举一个大于2的长度j,往后扫跟它height>=j的元素。
//为了避免重复,j每次枚举时从height[i-1]开始枚举
//注意:保证字典序从小到大
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+;
int len,maxx,sa[N],tsa[N],rank[N],trank[N],h[N],c[N];
char s[N];
void DA(){
int p;
memset(c,,sizeof c);maxx=;
for(int i=;i<=len;i++) c[rank[i]=s[i]]++;
for(int i=;i<=maxx;i++) c[i]+=c[i-];
for(int i=len;i;i--) sa[c[rank[i]]--]=i;
trank[sa[]]=p=;
for(int i=;i<=len;i++){
if(rank[sa[i]]!=rank[sa[i-]]) p++;
trank[sa[i]]=p;
}
for(int i=;i<=len;i++) rank[i]=trank[i];
for(int k=;p<len;k<<=,maxx=p){
p=;
for(int i=len-k+;i<=len;i++) tsa[++p]=i;
for(int i=;i<=len;i++) if(sa[i]>k) tsa[++p]=sa[i]-k;
memset(c,,sizeof c);
for(int i=;i<=len;i++) trank[i]=rank[tsa[i]];
for(int i=;i<=len;i++) c[trank[i]]++;
for(int i=;i<=maxx;i++) c[i]+=c[i-];
for(int i=len;i;i--) sa[c[trank[i]]--]=tsa[i];
trank[sa[]]=p=;
for(int i=;i<=len;i++){
if(rank[sa[i]]!=rank[sa[i-]]||rank[sa[i]+k]!=rank[sa[i-]+k]) p++;
trank[sa[i]]=p;
}
for(int i=;i<=len;i++) rank[i]=trank[i];
}
for(int i=,k=;i<=len;i++){
int j=sa[rank[i]-];
while(s[i+k]==s[j+k]) k++;
h[rank[i]]=k;if(k>) k--;
}
}
int main(){
scanf("%d%s",&len,s+);
DA();
for(int i=,pre=;i<=len;i++){
for(int j=pre+;j<=h[i];j++){
int ans=,k=i;
while(h[k]>=j) k++,ans++;
printf("%d\n",ans);
}
pre=h[i];
}
return ;
}

最新文章

  1. sql中not exists的用法
  2. PS Web切图界面设置
  3. 18.中介者模式(Mediator Pattern)
  4. Eclipse远程调试出现“JDWP Transport dt_socket failed to initialize”的解决方案
  5. centos6.5安装vmware-tools
  6. 深入理解JVM—字节码执行引擎
  7. c语言知识(找出大于2门成绩不及格的学生)
  8. Josn转DataTable(转)
  9. java学习:AWT组件和事件处理的笔记(1)--菜单条,菜单,菜单项
  10. VSTO学习笔记(九)浅谈Excel内容比较
  11. powerdesigner 连接 Oracle ,并将表结构导入到powerdesigner中
  12. mvc学习过程碰到问题
  13. Linux下定时器
  14. mysql 原理 ~ checkpoint
  15. JAVA基础知识总结:十三
  16. angular.js 教程 -- 实例讲解
  17. P3000 [USACO10DEC]牛的健美操Cow Calisthenics
  18. Error: Target id is not valid ABIs: no ABIs 解决方法
  19. C柔性数组
  20. WPF设置动画在控件载入时就立刻执行

热门文章

  1. 在SpringBoot中对SpringSecurity的基本使用
  2. DataSet用法一:添加代码创建的表DataTable,设置主键外键,读取及修改DataSet表中数据
  3. net3:DropDownList的动态绑定
  4. webconfig连接串的使用与用代码写连接串的使用
  5. 前端开发 CSS中你所不知道的伪类与伪元素的区别--摘抄
  6. 批处理命令之Start的详细用法
  7. 利用jenkins和hockey组织iOS持续交付过程
  8. Windows Builder(图形化界面的利器)For Eclipse 3.7
  9. Software Engineering | Factory method pattern
  10. IntelliJ IDEA重构技巧收集