肉丝哥哥钦定好题 话说我的blog现在为什么到处都是肉丝哥哥

先来想一个弱化版,假如能够n整除K怎么做?

把每个数字看成一个字符串,按字典序排名,这个可以后缀数组解决,然后暴力枚举每种情况,O(1)判两个长度为n/K的数字大小即可

然后不能整除一定是有n-n/K*K个长度为n/K+1的数字

先二分答案排名,枚举起始位置,考虑一个贪心的做法,假如当前能够放一个长度为n/K+1的就立刻放,这样能够保证最优

why?放n/K+1和n/K的区别相当于多往前走了1步,但是多用了一组n/K+1,假如走n/K在未来某一决策能够走n/K+1,那么当前走n/K+1只需付出少用一组就可以拉回同一起跑线。其实也就是具有决策包容性

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int _=1e2;
const int maxn=*2e5+_;
int n,K,U;char ss[maxn]; int sa[maxn],Rank[maxn];
namespace SA
{
int Rsort[maxn],tt[maxn];
void getsa(int n,int m)
{
for(int i=;i<=n;i++)Rank[i]=ss[i]-''; memset(Rsort,,sizeof(Rsort));
for(int i=;i<=n;i++)Rsort[Rank[i]]++;
for(int i=;i<=m;i++)Rsort[i]+=Rsort[i-];
for(int i=n;i>=;i--)sa[Rsort[Rank[i]]--]=i; int ln=,p=;
while(p<n)
{
int k=;for(int i=n-ln+;i<=n;i++)tt[++k]=i;
for(int i=;i<=n;i++)
if(sa[i]-ln>)tt[++k]=sa[i]-ln; memset(Rsort,,sizeof(Rsort));
for(int i=;i<=n;i++)Rsort[Rank[tt[i]]]++;
for(int i=;i<=m;i++)Rsort[i]+=Rsort[i-];
for(int i=n;i>=;i--)sa[Rsort[Rank[tt[i]]]--]=tt[i]; for(int i=;i<=n;i++)tt[i]=Rank[i]; p=;Rank[sa[]]=;
for(int i=;i<=n;i++)
{
if(tt[sa[i]]!=tt[sa[i-]]||tt[sa[i]+ln]!=tt[sa[i-]+ln])p++;
Rank[sa[i]]=p;
} m=p;ln*=;
}
}
void GetTrueRank(int n)
{
int p=;
for(int i=;i<=*n-;i++)
if(sa[i]<=n)Rank[sa[i]]=Rank[sa[i]+n]=++p; for(int i=;i<=n;i++)sa[Rank[i]]=i;
}
void main(int n){getsa(*n-,);GetTrueRank(n);}
} namespace PRINT
{
void main(int ans,int len)
{
int st=sa[ans];
for(int i=;i<=len;i++)putchar(ss[i+st-]);
puts("");
}
}
namespace SOL1
{
void main()
{
int ans=(<<);
for(int i=;i<=U;i++)
{
int num=,tt=;
for(int j=;j<=K;j++)
num=max(num,Rank[i+tt]),tt+=U;
ans=min(ans,num);
}
PRINT::main(ans,U);
}
}
namespace SOL2
{
int calc(int em)
{
int mmax=;
for(int i=;i<=U+;i++)
{
int p=i,num=;
for(int j=;j<=K;j++)
{
if(Rank[p]<=em)p+=U+,num++;
else p+=U;
if(p>=i+n-)break;
}
mmax=max(mmax,num);
}
return mmax;
}
void main()
{
int res=n-U*K;
int el=,er=n,em,ans;
while(el<=er)
{
em=(el+er)/;
if(calc(em)>=res)
{
er=em-;
ans=em;
}
else el=em+;
}
PRINT::main(ans,U+);
}
} int main()
{
scanf("%d%d%s",&n,&K,ss+); U=n/K;
for(int i=;i<n;i++)ss[i+n]=ss[i];
SA::main(n); if(n%K==)SOL1::main();
else SOL2::main(); return ;
}

bzoj4486: [Jsoi2015]串分割的更多相关文章

  1. 「JSOI2015」串分割

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

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

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

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

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

  4. 【bzoj4486】【JSOI2015】串分割

    老省选题了. 首先考虑怎么比较超长数字的大小? 参见UTR1的那道题 先比size,然后比较字典序即可. 接下来考虑下切割的问题. 因为要将字符串切割成k份,所以这个字符串只会存在n/k个本质不同的起 ...

  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. 洛谷——P1657 选书

    P1657 选书 题目描述 学校放寒假时,信息学奥赛辅导老师有1,2,3……x本书,要分给参加培训的x个人,每人只能选一本书,但是每人有两本喜欢的书.老师事先让每个人将自己喜欢的书填写在一张表上.然后 ...

  2. 猴子都能懂的git教程链接

    http://backlogtool.com/git-guide/cn/intro/intro1_1.html

  3. Typora +google + Markdown Here 公众号

    一劳永逸的公众号排版方法  http://mp.weixin.qq.com/s/zb-YaacNLggG2-njF5HJ0A 

  4. 【GitHub】删除GitHub上的文件

    想要删除已经提交上GitHub上的文件, 删除之后,如果这个文件夹下没有文件了,这个文件夹也会被删除! 并且在它的上层文件夹后面 有提示删除了这个文件的信息!!

  5. xamarin.android pullToRefresharp.Android下拉刷新样式、侧滑删除功能

    如果你正则使用xamarin.From开发项目,那么listview一定是你比不可少的控件.但是由于xamarin的listview在安卓上的功能有限,所以经常需要使用Renderers来改写平台实现 ...

  6. iOS -- 设置label的自适应

    - (void)AutoLabel { //准备工作 self.font = [UIFont systemFontOfSize:]; self.textColor = [UIColor whiteCo ...

  7. U-net图像分割

    [Keras]基于SegNet和U-Net的遥感图像语义分割 2014 年,加州大学伯克利分校的 Long 等人提出全卷积网络(FCN),这使得卷积神经网络无需全连接层即可进行密集的像素预测,CNN ...

  8. AngularJS的表单验证提交示例

    代码下载:https://files.cnblogs.com/files/xiandedanteng/angularjsFormSubmit.rar 前台代码: <%@ page content ...

  9. 剖析CPU温度监控技术

    转载 :剖析CPU温度监控技术   标签: CPU 温度控制技术 1805 具体温度检测调整代码(转载)        迄今为止还没有一种cpu散热系统能保证永不失效.失去了散热系统保护伞的“芯”,往 ...

  10. Mysql启动自己主动设置max_connections为其它值

    背景 有同学反应.产品连不上,登陆到server.发现连接数不够了. 接着先重新启动mysql,发如今mysql启动的时候会报Waring Warning Changed limits: max_op ...