zoukankan      html  css  js  c++  java
  • 后缀数组一·重复旋律

    后缀数组一·重复旋律

    http://hihocoder.com/problemset/problem/1403

    时间限制:5000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一个音乐旋律被表示为长度为 N 的数构成的数列。

    小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律。旋律是一段连续的数列,相似的旋律在原数列可重叠。比如在1 2 3 2 3 2 1 中 2 3 2 出现了两次。

    小Hi想知道一段旋律中出现次数至少为K次的旋律最长是多少?

     

    输入

    第一行两个整数 N和K。1≤N≤20000 1≤K≤N

    接下来有 N 个整数,表示每个音的数字。1≤数字≤100

    输出

    一行一个整数,表示答案。

    样例输入
    8 2
    1
    2
    3
    2
    3
    2
    3
    1
    样例输出
    4

    二分答案,判断height数组的值有没有连续m-1个大于等于mid的

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define maxn 1000006
     5 
     6 struct DA{
     7     int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
     8     int cmp(int *r,int a,int b,int l){
     9         return r[a]==r[b]&&r[a+l]==r[b+l];
    10     }
    11 
    12     void da(int *r,int *sa,int n,int m){
    13         int i,j,p,*x=wa,*y=wb,*t;
    14         for(i=0;i<m;i++) ws[i]=0;
    15         for(i=0;i<n;i++) ws[x[i]=r[i]]++;
    16         for(i=1;i<m;i++) ws[i]+=ws[i-1];
    17         for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;
    18 
    19         for(j=1,p=1;p<n;j*=2,m=p){
    20 
    21             for(p=0,i=n-j;i<n;i++) y[p++]=i;
    22             for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
    23             for(i=0;i<n;i++) wv[i]=x[y[i]];
    24 
    25             for(i=0;i<m;i++) ws[i]=0;
    26             for(i=0;i<n;i++) ws[wv[i]]++;
    27             for(i=1;i<m;i++) ws[i]+=ws[i-1];
    28             for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];
    29 
    30             for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
    31                 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
    32         }
    33         return;
    34     }
    35     int Rank[maxn],height[maxn];
    36     void calheight(int *r,int *sa,int n){
    37         int i,j,k=0;
    38         for(i=1;i<=n;i++) Rank[sa[i]]=i;
    39         for(i=0;i<n;height[Rank[i++]]=k)
    40             for(k?k--:0,j=sa[Rank[i]-1];r[i+k]==r[j+k];k++);
    41         return;
    42     }
    43 }da;
    44 
    45 int a[maxn],b[maxn];
    46 int str[maxn];
    47 int n,m;
    48 
    49 bool erfen(int mid){
    50     int co=1;
    51     for(int i=1;i<=n;i++){
    52         if(da.height[i]>=mid){
    53             co++;
    54             if(co>=m) return true;
    55         }
    56         else{
    57             co=1;
    58         }
    59     }
    60     return false;
    61 }
    62 
    63 int main(){
    64     #ifndef ONLINE_JUDGE
    65         freopen("input.txt","r",stdin);
    66     #endif
    67     std::ios::sync_with_stdio(false);
    68     cin>>n>>m;
    69     for(int i=0;i<n;i++) cin>>a[i];
    70     da.da(a,b,n+1,1005);
    71     da.calheight(a,b,n);
    72     int l=0,r=n,mid,tmp;
    73     int ans=0;
    74     while(l<=r){
    75         mid=l+r>>1;
    76         if(erfen(mid))l=mid+1;
    77         else r=mid-1;
    78     }
    79     cout<<r<<endl;
    80 }
    View Code
  • 相关阅读:
    初学者bootstrap(五)JavaScript插件(上)在路上(6)
    初学者bootstrap(三)下载与安装在路上(7)
    Viewport响应式 Web 设计在路上(13)
    初学者动画(一)在路上(3)
    svn添加强制注释,precommit结合python
    ftpclient卡死问题
    @Transactional失效的问题
    javamail发送二进制流附件的问题
    springmvc附件上传核心代码
    kafka集群配置与测试
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/10398047.html
Copyright © 2011-2022 走看看