bzoj4486: [Jsoi2015]串分割
肉丝哥哥钦定好题 话说我的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]串分割的更多相关文章
- 「JSOI2015」串分割
「JSOI2015」串分割 传送门 首先我们会有一个贪心的想法:分得越均匀越好,因为长的绝对比短的大. 那么对于最均匀的情况,也就是 \(k | n\) 的情况,我们肯定是通过枚举第一次分割的位置,然 ...
- C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出
C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出 strstr() 命令是在原字符串中查找指定的字符串第一次出现的地址,用这个特性可以实现字符的分割,判断是否包涵等功能: ...
- Minimum Palindromic Factorization(最少回文串分割)
Minimum Palindromic Factorization(最少回文串分割) 以下内容大部分(可以说除了关于回文树的部分)来自论文A Subquadratic Algorithm for Mi ...
- 【bzoj4486】【JSOI2015】串分割
老省选题了. 首先考虑怎么比较超长数字的大小? 参见UTR1的那道题 先比size,然后比较字典序即可. 接下来考虑下切割的问题. 因为要将字符串切割成k份,所以这个字符串只会存在n/k个本质不同的起 ...
- Java开发笔记(三十七)利用正则串分割字符串
前面介绍了处理字符串的常用方法,还有一种分割字符串的场景也很常见,也就是按照某个规则将字符串切割为若干子串.分割规则通常是指定某个分隔符,根据字符串内部的分隔符将字符串进行分割,例如逗号.空格等等都可 ...
- 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) ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- SAM 做题笔记(各种技巧,持续更新,SA)
SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模 ...
随机推荐
- [开源] FreeSql.Tools Razor 生成器
FreeSql 经过半年的开发和坚持维护,在 0.6.x 版本中完成了几大重要事件: 1.按小包拆分,每个数据库实现为单独 dll: 2.实现 .net framework 4.5 支持: 3.同时支 ...
- T2821 天使之城 codevs
http://codevs.cn/problem/2821/ 题目描述 Description 天使城有一个火车站,每辆火车都从A方向驶入车站,再从B方向驶出车站. 为了调度火车,火车站设有停放轨道, ...
- [JSOI 2015] 子集选取
4475: [Jsoi2015]子集选取 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 363 Solved: 255[Submit][Status] ...
- 笔记-迎难而上之Java基础进阶6
import java.io.*; public class InputStreamDemo{ public static void main(String[] args) throws IOExce ...
- TCP11种状态
2.全部11种状态 2.1.客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT . 2.2.服务器独有的:(1)L ...
- IDEA一个窗口打开多个项目
首先IDEA没有Eclipse的Workspace的概念,且IDEA推荐是一个窗口对应着一个Project. 然后经过研究你会发现IDEA其实是由一个主进程来维护这些窗口的,所以即使你开了很多个窗口, ...
- 品质与合身 无须昂贵 | Tailorwoods在线男装定制
品质与合身 无须昂贵 | Tailorwoods在线男装定制 北京市朝阳区姚家园北一路八月照相馆2F
- 写一个dup2功能同样的函数,不能调用 fcntl 函数,而且要有出错处理
实现的时候用到系统原来的dup函数 // mydup2.c // 2015/08/17 Lucifer Zhang version1.0 // write my own dup2 function / ...
- 无向图的点双连通分量(tarjan模板)
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i ...
- 【凯子哥带你夯实应用层】使用ActionProvider实现子菜单时遇到的一个坑
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 近期在重温Android基础.在看到ActionProvider的时候遇到一个坑.分享到大家,避免入坑. 首 ...