【bzoj4486】【JSOI2015】串分割

來源:互聯網
上載者:User

標籤:log   cal   line   oid   print   scan   int   接下來   scanf   

老省選題了。

首先考慮怎麼比較超長數位大小?

參見UTR1的那道題

先比size,然後比較字典序即可。

接下來考慮下切割的問題。

因為要將字串切割成k份,所以這個字串只會存在n/k個本質不同的起始位置。

然後可能會發現,如果能夠整除的話,將這些起始位置直接尾碼排序就可以了。

那麼如果不能整除怎麼辦?

我們可以發現,如果有多餘的,那麼最長的字串一定最多比別人多1

這個貪心的正確性比較的顯然。

那麼我們怎麼處理長度不同的呢?

將之前的比較二分即可。

#include<bits/stdc++.h>#define N 400010using namespace std;int t1[N],t2[N],a[N],sa[N],rk[N],c[20],h[N];int n,m,k,cnt;char s[N];void calcsa(int n,int m){    int *x=t1,*y=t2,f=0,p=0;    for(int i=1;i<=m;i++)c[i]=0;    for(int i=1;i<=n;i++)c[x[i]=a[i]]++;    for(int i=1;i<=m;i++)c[i]+=c[i-1];    for(int i=n;i;i--)sa[c[x[i]]--]=i;    for(int i=1;i<=n&&p<=n;i<<=1){p=0;        for(int j=n-i+1;j<=n;j++)y[++p]=j;        for(int j=1;j<=n;j++)if(sa[j]>i)y[++p]=sa[j]-i;        for(int j=1;j<=m;j++)c[j]=0;        for(int j=1;j<=n;j++)c[x[y[j]]]++;        for(int j=1;j<=m;j++)c[j]+=c[j-1];        for(int j=n;j>=1;j--)sa[c[x[y[j]]]--]=y[j];        swap(x,y);x[sa[1]]=1;p=2;        for(int j=2;j<=n;j++)        x[sa[j]]=y[sa[j]]==y[sa[j-1]]&&y[sa[j]+i]==y[sa[j-1]+i]?p-1:p++;        m=p;    }    for(int i=1;i<=n;i++)rk[sa[i]]=i;    for(int i=1;i<=n;i++){        int j=sa[rk[i]-1];        if(f)f--;while(a[i+f]==a[j+f])f++;        h[rk[i]]=f;    }}inline bool check(int x){    int p;    for(int i=1;i<=m;i++){        int t=i;p=k;        while(p--){            if(rk[t]<=x)t+=m;else t+=m-1;            if(t>=n+i)return 1;        }    }    return 0;}inline void work(){    int l=1,r=cnt;    while(l<r){        int mid=(l+r)>>1;        if(check(mid))r=mid;else l=mid+1;    }    for(int i=1;i<=n;i++)if(rk[i]==l)    for(int j=i;j<=i+m-1;j++)printf("%c",a[j]+‘1‘);    puts("");}int main(){    scanf("%d%d",&n,&k);scanf("%s",s+1);    for(int i=1;i<=n;i++)a[++cnt]=s[i]-‘1‘;    for(int i=1;i<n;i++)a[++cnt]=s[i]-‘1‘;    calcsa(cnt,10);    //for(int i=1;i<=cnt;i++)printf("%d ",sa[i]);puts("");    m=n/k+(n%k!=0);    work();}

 

【bzoj4486】【JSOI2015】串分割

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.