老省选题了。

首先考虑怎么比较超长数字的大小?

参见UTR1的那道题

先比size,然后比较字典序即可。

接下来考虑下切割的问题。

因为要将字符串切割成k份,所以这个字符串只会存在n/k个本质不同的起始位置。

然后可能会发现,如果能够整除的话,将这些起始位置直接后缀排序就可以了。

那么如果不能整除怎么办?

我们可以发现,如果有多余的,那么最长的字符串一定最多比别人多1

这个贪心的正确性比较的显然。

那么我们怎么处理长度不同的呢?

将之前的比较二分即可。

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

最新文章

  1. C# 后台获取WebApi 方法
  2. Spring-JDBC通用Dao
  3. JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
  4. [工作需求]linux常用命令以及vim常用命令
  5. 【VMware虚拟化解决方案】设计和配置VMware vCenter 5.5
  6. centos 端口开放及关闭
  7. 问题:Maven: missing net.sf.json-lib
  8. 上海Uber优步司机奖励政策(1月25日~1月31日)
  9. Eclipse 打包过滤 Log.e
  10. textFiled输入字数的控制问题之—把带输入的拼音也判断了
  11. Java中能否利用函数参数来返回值
  12. 播放包含flash内容的网页或flash内容, 无法显示相应flash内容
  13. python3 电脑说话
  14. 使用Json.net对Json进行遍历
  15. python--第十一天总结(paramiko 及数据库操作)
  16. mvc,mvp.mvvm模型
  17. BZOJ3545 [ONTAK2010]Peaks kruskal 并查集 主席树 dfs序
  18. Unity WidgetsUI CreateTaskView Demo
  19. 3675: [Apio2014]序列分割
  20. C++类模板的三种特化

热门文章

  1. CodeChef LEMOVIE
  2. 【原创】宿主机远程登录虚拟机(windows server 2003系统)
  3. [WC2005]双面棋盘
  4. 【bzoj2743】[HEOI2012]采花 树状数组
  5. BZOJ1046 [HAOI2007]上升序列 【LIS + 字典序最小】
  6. atom的快捷键,你hold住吗?
  7. Aidl实现进程间通信,跨进程回调
  8. Using CORS(译)
  9. sql service (case when then else end ..... group by)
  10. Tomcat7项目迁移到Tomcat8中文乱码问题