【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

Sample Output

3
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
原创粉丝点击