题目链接:

http://acm.hust.edu.cn/vjudge/problem/82135

Circle of digits

Time Limit: 3000MS

题意

把循环串分割成k块,让值最大的那块值最小。

题解

用后缀数组给循环串排序。然后二分答案(长度肯定为(n+k-1)/k)。二分判断时,枚举分割的起点,然后贪心每次尽可能取长度为(n+k-1)/k。

代码

#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
//#define lson (o<<1)
//#define rson ((o<<1)|1)
//#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) ;//cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++) typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8; const int maxn = 1e5 + 10; int n,k; struct SuffixArray{
char s[maxn];
int sa[maxn],t[maxn],t2[maxn],c[maxn];
int n,m;
void init(int n,int m){
this->n=n;
this->m=m;
}
void build_sa(){
int i,*x=t,*y=t2;
for(i=0;i<m;i++) c[i]=0;
for(i=0;i<n;i++) c[x[i]=s[i]]++;
for(i=1;i<m;i++) c[i]+=c[i-1];
for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i;
for(int k=1;k<=n;k<<=1){
int p=0;
for(i=0;i<n;i++) y[p++]=(sa[i]-k+n)%n; for(i=0;i<m;i++) c[i]=0;
for(i=0;i<n;i++) c[x[y[i]]]++;
for(i=1;i<m;i++) c[i]+=c[i-1];
for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i]; swap(x,y);
p=1; x[sa[0]]=0;
for(i=1;i<n;i++){
x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;
}
if(p>=n) break;
m=p;
}
}
int cmp(int p1,int p2){
int ret=0;
int len=(n+k-1)/k;
rep(i,0,len){
if(s[(p1+i)%n]<s[(p2+i)%n]) return -1;
if(s[(p1+i)%n]>s[(p2+i)%n]) return 1;
}
return 0;
}
bool check(int x){
int len=(n+k-1)/k;
bug(sa[x]);
bug(x);
rep(i,0,len){
int ed=i;
rep(j,0,k){
if(cmp(ed%n,sa[x])<=0){
bug(ed%n);
ed+=len;
}
else ed+=len-1;
}
if(ed-i>=n) return true;
}
return false;
}
void solve(){
build_sa();
int l=0,r=n-1;
while(l<r){
int mid=l+(r-l)/2;
if(check(mid)) r=mid;
else l=mid+1;
}
int len=(n+k-1)/k;
for(int i=sa[r];i<len+sa[r];i++) printf("%c",s[i%n]);
printf("\n");
}
}mysa; int main() {
while(scanf("%d%d",&n,&k)==2&&n){
mysa.init(n,256);
scanf("%s",mysa.s);
mysa.solve();
}
return 0;
}

UVALive - 6856 Circle of digits 后缀数组+二分的更多相关文章

  1. BZOJ 3230: 相似子串( RMQ + 后缀数组 + 二分 )

    二分查找求出k大串, 然后正反做后缀数组, RMQ求LCP, 时间复杂度O(NlogN+logN) -------------------------------------------------- ...

  2. BZOJ_2946_[Poi2000]公共串_后缀数组+二分答案

    BZOJ_2946_[Poi2000]公共串_后缀数组+二分答案 Description          给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l        读入单 ...

  3. 【bzoj4310】跳蚤 后缀数组+二分

    题目描述 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最大的那一个 ...

  4. BZOJ 1717 [USACO06DEC] Milk Patterns (后缀数组+二分)

    题目大意:求可重叠的相同子串数量至少是K的子串最长长度 洛谷传送门 依然是后缀数组+二分,先用后缀数组处理出height 每次二分出一个长度x,然后去验证,在排序的后缀串集合里,有没有连续数量多于K个 ...

  5. POJ 1743 [USACO5.1] Musical Theme (后缀数组+二分)

    洛谷P2743传送门 题目大意:给你一个序列,求其中最长的一对相似等长子串 一对合法的相似子串被定义为: 1.任意一个子串长度都大于等于5 2.不能有重叠部分 3.其中一个子串可以在全部+/-某个值后 ...

  6. Poj 1743 Musical Theme(后缀数组+二分答案)

    Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 28435 Accepted: 9604 Descri ...

  7. Poj 3261 Milk Patterns(后缀数组+二分答案)

    Milk Patterns Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk g ...

  8. HDU5008 Boring String Problem(后缀数组 + 二分 + 线段树)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5008 Description In this problem, you are given ...

  9. LA 6856 Circle of digits 解题报告

    题目链接 先用后缀数组给串排好序.dc3 O(n) 二分答案+贪心check 答案的长度len=(n+k-1)/k 如果起点为i长为len串大于当前枚举的答案,i的长度取len-1 从起点判断k个串的 ...

随机推荐

  1. PHP中$a && $b = $c 语法的用法

    $a && $b = $c 表示:如果$a为真,则执行$b = $c,否则不执行. 可以用if语句替代: if ($a) { $b = $c; } 实例: $a = true; $b ...

  2. mongodb C++ Driver安装

    前言 mongocxx官网地址 http://mongocxx.org/?jmp=docs 本文的安装版本是:mongocxx-r3.2.0.tar.gz . 参考文档安装过程http://mongo ...

  3. AtCoder Grant Contest 10.F 博弈

    题意:给定一棵树,每个节点有个权值,Alice和Bob轮流进行操作,给定游戏起点指针指向节点C.不断进行下述操作. 1.将当前节点权值-1,然后将指针从该节点移动到相邻节点,出现一方不能移动(即指针指 ...

  4. 如何将github项目上传至gitlab

    一.修改远程分支关联 删除远程分支关联 将指向github的远程分支关联关系删除 git remote rm origin 添加新的远程分支关联 新的remote地址指向gitlab相应地址 git ...

  5. 20154327 Exp6 信息搜集与漏洞扫描

    基础问题回答 (1)哪些组织负责DNS,IP的管理. 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和IP地址管理. 全球根域名服务器:绝大多数在欧洲和北美(全球13 ...

  6. dfs 队列

    题目来源  poj 1562 Description The GeoSurvComp geologic survey company is responsible for detecting unde ...

  7. Spring缓存穿透问题修复

    本文来自网易云社区. 本剧情纯属真实,犹如雷同实乃缘分. 发生 事情的发生在某天早上,天气怎样反正是忘了,只记得当时监控平台大量的数据库错误报警. 作为后端开发,当看到日志中大量的db连接获取失败,心 ...

  8. 使用Unity创建依赖注入

        这篇文章翻译自<Dependency Injection With Unity>第三章.文中提到的类似"前几节"的内容您不必在意,相信您可以看懂的. P.S:如 ...

  9. python import vs from import

    https://stackoverflow.com/questions/9439480/from-import-vs-import

  10. Qt listwigwt item 加入自定义元素

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...