【bzoj2551】【外星联络】【后缀数组】
来源:互联网 发布:食物卡路里计算软件 编辑:程序博客网 时间:2024/04/29 23:02
Description
小 P 在看过电影《超时空接触》(Contact)之后被深深的打动,决心致力于寻
找外星人的事业。于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星
人发来的信息。虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高
低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在
其中。他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以
他希望找到他接受到的 01 串中所有重复出现次数大于 1 的子串。但是他收到的
信号串实在是太长了,于是,他希望你能编一个程序来帮助他。
Input
输入文件的第一行是一个整数N ,代表小 P 接收到的信号串的长度。
输入文件第二行包含一个长度为N 的 01 串,代表小 P 接收到的信号串。
Output
输出文件的每一行包含一个出现次数大于1 的子串所出现的次数。输出的顺
序按对应的子串的字典序排列。
Sample Input
7
1010101
1010101
Sample Output
3
3
2
2
4
3
3
2
2
3
2
2
4
3
3
2
2
HINT
对于 100%的数据,满足 0 <= N <=3000
题解:把后缀数组求出来然后暴力即可.
代码:
#include<iostream>#include<cstdio>#include<cstring>#define N 30010#define M 30010 using namespace std;int t1[N],t2[N],sa[N],c[M],s[N],height[N],rank[N],n;char ch[N];bool cmp(int *y,int p,int q,int k){ int a=(p+k>=n)?-1:y[p+k]; int b=(q+k>=n)?-1:y[q+k]; return a==b&&y[p]==y[q];}void build_sa(int m){ int *x=t1,*y=t2; for (int i=0;i<m;i++) c[i]=0; for (int i=0;i<n;i++) c[x[i]=s[i]]++; for (int i=1;i<m;i++) c[i]+=c[i-1]; for (int i=n-1;i>=0;i--) sa[--c[x[i]]]=i; for (int k=1;k<=n;k<<=1){ int p(0); for (int i=n-k;i<n;i++) y[p++]=i; for (int i=0;i<n;i++) if (sa[i]>=k) y[p++]=sa[i]-k; for (int i=0;i<m;i++) c[i]=0; for (int i=0;i<n;i++) c[x[y[i]]]++; for (int i=1;i<m;i++) c[i]+=c[i-1]; for (int i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1;x[sa[0]]=0; for (int i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i],sa[i-1],k)?p-1:p++; if (p>=n) break; m=p; }}void getheight(){ int k=0; for (int i=0;i<n;i++) rank[sa[i]]=i; for (int i=0;i<n;i++){ if (!rank[i]) continue; if (k) k--; int j=sa[rank[i]-1]; while (s[i+k]==s[j+k]) k++; height[rank[i]]=k; }}int main(){ scanf("%d",&n); scanf("%s",ch); for (int i=0;i<n;i++) s[i]=ch[i]-'0'+1; //for (int i=0;i<n;i++) cout<<s[i]<<' '; build_sa(3);getheight();int k(0); for (int i=1;i<n;i++) for (int j=height[i-1]+1;j<=height[i];j++){ for (k=i+1;height[k]>=j&&k<n;k++); if (k-i!=0) printf("%d\n",k-i+1); } }
0 0
- 【bzoj2551】【外星联络】【后缀数组】
- 【BZOJ2251】外星联络 后缀数组
- [2010Beijing Wc]外星联络 后缀数组
- 2251: [2010Beijing Wc]外星联络 后缀数组
- BZOJ 2251: [2010Beijing Wc]外星联络|后缀数组
- BZOJ 2251 Beijing WC 2010 外星联络 后缀数组
- 【BZOJ 2251】[2010Beijing Wc]外星联络 后缀数组
- [BZOJ2251][2010Beijing Wc]外星联络(后缀数组)
- bzoj 2251: [2010Beijing Wc]外星联络 (后缀数组)
- BZOJ2251: [2010Beijing Wc]外星联络 后缀数组
- bzoj2251[2010Beijing Wc]外星联络 后缀数组
- bzoj2251 [2010Beijing WC]外星联络(后缀数组+暴力)
- [bzoj2251][后缀数组][2010Beijing Wc]外星联络
- BZOJ 2251 2010Beijing WC 外星联络 后缀数组/Trie树
- bzoj-2251 外星联络
- bzoj2251 外星联络
- HYSBZ 2251 外星联络
- [2010Beijing Wc]外星联络
- Oracle:系统内存不足引起的ORA-12518: TNS: 监听程序无法分发客户机连接
- 由内存屏障查到的
- tomcat不识别maven web项目问题解决
- swift下nsmutabledicionary从文件读入的写法
- git使用总结。分支管理,版本跳转回退
- 【bzoj2551】【外星联络】【后缀数组】
- WinForm之拦截双击标题栏/移动窗体的系统消息
- 关于判断Excel中DEL的行
- 添加jar到本地仓库-对于maven下载不到的jar
- JAVA 学习笔记(二)-注解
- 改本机ip为英文
- A way to extend a RAW image's storage by using qemu-img
- linux下搭建生成HLS所需的.ts和.m3u8文件
- 怎么在delphi中读取Excel数据(各种详细操作)