• BZOJ2251


    【bzoj2251】[2010Beijing Wc]外星联络

    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

    ********************************************************************************************

    题意:01串中,查找所有出现次数大于1的子串出现次数(按照字典序输出)

    height[i]表示排名第i和第i-1的前缀的公共前缀长度。这一部分一定次数大于是。

    这样依次判断后面的height[]是不是大于height[i]就可以判断对应的串的长度。

    但是height[i]对应的串一定要从height[i-1]+1开始,因为那些是height[i-1]对应的串。

    看代码吧,有点胡言乱语了!

    *******************************************************************************************

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=3010;
     4 char c[maxn];
     5 int s[maxn],sa[maxn],rank[maxn],saf[maxn],cs[maxn],height[maxn];
     6 int n,m;
     7 void init()
     8 {
     9     scanf("%d",&n);
    10     scanf("%s",c);
    11     for(int i=0;i<n;++i)s[i+1]=c[i];
    12     s[0]=s[n+1]=-1;
    13 }
    14 void rsort()
    15 {
    16     for(int i=0;i<=m;++i)cs[i]=0;
    17     for(int i=1;i<=n;++i)cs[rank[saf[i]]]++;
    18     for(int i=1;i<=m;++i)cs[i]+=cs[i-1];
    19     for(int i=n;i>=1;--i)sa[cs[rank[saf[i]]]--]=saf[i];
    20 }
    21 int cmp(int *f,int x,int y,int w)
    22 {
    23     return f[x]==f[y] && f[x+w]==f[y+w];
    24 }
    25 void suffix()
    26 {
    27     for(int i=1;i<=n;++i)rank[i]=s[i],saf[i]=i;
    28     m=127;rsort();
    29     for(int p=1,w=1,i;p<n;w<<=1,m=p)
    30     {
    31         for(i=n-w+1,p=0;i<=n;++i)saf[++p]=i;
    32         for(i=1;i<=n;++i)if(sa[i]>w)saf[++p]=sa[i]-w;
    33         rsort();swap(rank,saf);rank[sa[1]]=p=1;
    34         for(i=2;i<=n;++i)rank[sa[i]]=cmp(saf,sa[i],sa[i-1],w)?p:++p;
    35     }
    36     int j,k=0;
    37     for(int i=1;i<=n;height[rank[i++]]=k)
    38         for(k=k?k-1:k,j=sa[rank[i]-1];s[i+k]==s[j+k];++k);
    39 }
    40 void work()
    41 {
    42     for(int i=0;i<=n;++i)    //i:paiming
    43     {   //j:changdu
    44         for(int j=1+height[i];;j++)
    45         {   int js=1;
    46             for(int k=i+1;height[k]>=j;++k,++js);
    47             if(js>1)printf("%d
    ",js);
    48             else break;
    49         }
    50     }
    51 }
    52 int main()
    53 {
    54     init();
    55     suffix();
    56     work();
    57     return 0;
    58 }
    View Code
  • 相关阅读:
    NOIp2018集训test-10-17 (bike day3)
    NOIp2018集训test-10-16 (bike day2)
    django简介中
    django简介上
    bootstrap
    jQuery简介
    js完整篇
    css完结
    css三
    前端二与css开篇
  • 原文地址:https://www.cnblogs.com/gryzy/p/8287268.html
Copyright © 2020-2023  润新知