老省选题了。

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

参见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();
}

【bzoj4486】【JSOI2015】串分割的更多相关文章

  1. bzoj4486: [Jsoi2015]串分割

    肉丝哥哥钦定好题 话说我的blog现在为什么到处都是肉丝哥哥 先来想一个弱化版,假如能够n整除K怎么做? 把每个数字看成一个字符串,按字典序排名,这个可以后缀数组解决,然后暴力枚举每种情况,O(1)判 ...

  2. 「JSOI2015」串分割

    「JSOI2015」串分割 传送门 首先我们会有一个贪心的想法:分得越均匀越好,因为长的绝对比短的大. 那么对于最均匀的情况,也就是 \(k | n\) 的情况,我们肯定是通过枚举第一次分割的位置,然 ...

  3. C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出

    C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出 strstr() 命令是在原字符串中查找指定的字符串第一次出现的地址,用这个特性可以实现字符的分割,判断是否包涵等功能: ...

  4. Minimum Palindromic Factorization(最少回文串分割)

    Minimum Palindromic Factorization(最少回文串分割) 以下内容大部分(可以说除了关于回文树的部分)来自论文A Subquadratic Algorithm for Mi ...

  5. Java开发笔记(三十七)利用正则串分割字符串

    前面介绍了处理字符串的常用方法,还有一种分割字符串的场景也很常见,也就是按照某个规则将字符串切割为若干子串.分割规则通常是指定某个分隔符,根据字符串内部的分隔符将字符串进行分割,例如逗号.空格等等都可 ...

  6. Codeforces 898 贪心关闭最少闹钟 优先队列最少操作构造N/2squares 讨论情况哈希数字串分割a+b=c

    A /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a,b) ...

  7. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. SAM 做题笔记(各种技巧,持续更新,SA)

    SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模 ...

随机推荐

  1. cf Round 587

    A.Duff and Weight Lifting(思维) 显然题目中只有一种情况可以合并 2^a+2^a=2^(a+1).我们把给出的mi排序一下,模拟合并操作即可. # include <c ...

  2. BZOJ 1406 密码箱(数论)

    很简洁的题目.求出x^2%n=1的所有x<=n的值. n<=2e9. 直接枚举x一定是超时的. 看看能不能化成有性质的式子. 有 (x+1)(x-1)%n==0,设n=a*b,那么一定有x ...

  3. 【bzoj1737】[Usaco2005 jan]Naptime 午睡时间 dp

    题目描述 Goneril is a very sleep-deprived cow. Her day is partitioned into N (3 <= N <= 3,830) equ ...

  4. echart模块化单文件引入

    echart模块化单文件引入百度上面是推荐这样使用.今天看了一下,做了个Demo. 文件结构如下:

  5. HTML5可用的css reset

    html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, ci ...

  6. 如何提升集群资源利用率? 阿里容器调度系统Sigma 深入解析

    阿里妹导读:为了保证系统的在线交易服务顺利运转,最初几年,阿里都是在双11大促来临之前大量采购机器储备计算资源,导致了双11之后资源大量闲置点现象.是否能把计算任务与在线服务进行混合部署,在现有弹性资 ...

  7. BZOJ3172 [Tjoi2013]单词 【AC自动机】

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4293  Solved: 2083 [Submit][Stat ...

  8. HDOJ.2955 Robberies (01背包+概率问题)

    Robberies 算法学习-–动态规划初探 题意分析 有一个小偷去抢劫银行,给出来银行的个数n,和一个概率p为能够逃跑的临界概率,接下来有n行分别是这个银行所有拥有的钱数mi和抢劫后被抓的概率pi, ...

  9. 解决jsp两种提交方式乱码 的方法

    解决中文乱码 ---post提交方式  需要在处理页面添加request.setCharacterEncoding("utf-8"); 制定请求的编码,调用一下request.ge ...

  10. Pycharm中一些不为人知的技巧

    工欲善其事必先利其器,Pycharm 是最受欢迎的Python开发工具,它提供的功能非常强大,是构建大型项目的理想工具之一,如果能挖掘出里面实用技巧,能带来事半功倍的效果. 以下操作都是基于 Wind ...