肉丝哥哥钦定好题 话说我的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. PAT 甲级 1045 Favorite Color Stripe(DP)

    题目链接 Favorite Color Stripe 题意:给定$A$序列和$B$序列,你需要在$B$序列中找出任意一个最长的子序列,使得这个子序列也是$A$的子序列 (这个子序列的相邻元素可以重复) ...

  2. Xamarin XAML语言教程XAML文件结构与解析XAML

    Xamarin XAML语言教程XAML文件结构与解析XAML XAML文件结构 在上文中,我们创建XAML文件后,会看到类似图1.16所示的结构 图1.16  结构 其中,.xaml文件和.xaml ...

  3. luogu P1922 女仆咖啡厅桌游吧

    题目背景 小v带萌萌的妹妹去玩,妹妹想去女仆咖啡馆,小v想去桌游吧. 妹妹:“我问你个问题,答不对你就做我一天的奴隶,答对了就今天我就全部听你的.” 小v:“全部都听!?” 妹妹:“嘻嘻嘻,你还是回答 ...

  4. java正则过虑字符

    public static void main(String[] args) { String testrString = "{\"abc\" : \"[123 ...

  5. standford情感分析代码开源地址

    http://nlp.stanford.edu/sentiment/code.html

  6. GDB调试多线程程序

    gdb有thread相关命令,如info thread(简写成info th)显示线程消息,b xx thread yy可以针对某个thread设置断点,thread xx(简写成thr xx)切换到 ...

  7. angular md-toast 颜色

    How to show md-toast with background color https://codepen.io/neilkalman/pen/jWBqve <div ng-contr ...

  8. 使用 sftp 向linux服务器传输文件

    sftp是加密的文件传输. 登陆 sftp name@123.21.331.1 1 2.把本地文件name1传到服务器name2下 put /name1.html /name2/ 1 把服务器name ...

  9. JD笔试试题(凭记忆写的+人生感悟 try finally )

    京东笔试:技术篇(一套卷.包含測试.算法,研发) 一:填空题(4分 * 15) 15 个 涉及的面很广的选择题,可是比較側重基础.包含数据结构的.c++类的,操作系统的,计算机网络的. 二:编程题(2 ...

  10. ListView 自己定义BaseAdapter实现单选打勾(无漏洞)

    (假设须要完整demo,请评论留下邮箱) (眼下源代码已经不发送.假设须要源代码,加qq316701116.不喜勿扰) 近期由于一个项目的原因须要自己定义一个BaseAdapter实现ListVIew ...