博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5030 Rabbit's String
阅读量:5961 次
发布时间:2019-06-19

本文共 2037 字,大约阅读时间需要 6 分钟。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5030

题意:给出一个长度为n的串S,将S分成最多K个子串S1,S2,……Sk(k<=K)。选出每个子串Si(1<=i<=k)的最大子串SSi。最后使得k个SSi的最大值最小。

思路:首先用后缀数组求出所有子串。二分答案串,判定是否存在一种分法满足要求。对于答案串A,设A起始位置所组成的后缀排名为t,在排名为[t+1,n]的后缀中截取子串S[Li,Ri],使得Ri<n(下标1到n),且该子串和A具有大于0的公共前缀(若这些之中存在与A的公共前缀为0的后缀则A不成立),那么这样的子串有啥性质呢?他们的性质就是他们加上他们在原串中的下一个字母后组成的串都比答案串A大(很显然吧。因为我们找的都是排名在A之后的后缀截取的)。那么,理论上来讲,这样的串一出现,我们就要截取一下,因为他们不能和后面一个字母挨在一起。

但是,看下面的情况,比如所有这样的串为:[4,10],[5,15],[5,20],[6,11],[6,25],[30,40],首先我们要在10的位置截开,这样[4,10]就不会跟后面一个字母挨在一起了,然后随着这一截开,[5,15],[5,20],[6,11],[6,25]这些串都被分成两段了,所以他们不用再被截开了,之后再从40位置截开。最后截了两次分成了三段。

 

const int INF=1000000005;const int N=111111;int r[N],sa[N],wa[N],wb[N],wd[N],rank[N],h[N];int cmp(int *r,int a,int b,int len){    return r[a]==r[b]&&r[a+len]==r[b+len];}void da(int *r,int *sa,int n,int m){    int i,j,p,*x=wa,*y=wb,*t;    FOR0(i,m) wd[i]=0;    FOR0(i,n) wd[x[i]=r[i]]++;    FOR1(i,m-1) wd[i]+=wd[i-1];	for(i=n-1;i>=0;i--) sa[--wd[x[i]]]=i;    for(j=1,p=1;p
<<=1,m=p) { p=0; for(i=n-j;i<=n-1;i++)y[p++]=i; FOR0(i,n) if(sa[i]>=j) y[p++]=sa[i]-j; FOR0(i,m) wd[i]=0; FOR0(i,n) wd[x[i]]++; FOR1(i,m-1) wd[i]+=wd[i-1]; for(i=n-1;i>=0;i--) sa[--wd[x[y[i]]]]=y[i]; t=x;x=y;y=t;p=1;x[sa[0]]=0; FOR1(i,n-1) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; }}void calHeight(int *r,int *sa,int n){ int i,j,k=0; FOR1(i,n) rank[sa[i]]=i; FOR0(i,n) { if(k) k--; j=sa[rank[i]-1]; while(i+k
V,p;int cal(){ if(SZ(V)==0) return 0; sort(all(V)); int minR=INF; p.clear(); int i; for(i=SZ(V)-1;i>=0;i--) { if(minR<=V[i].second) continue; minR=V[i].second; p.pb(V[i]); } int ans=0,last=-1; sort(all(p)); for(i=0;i
=p[i].first) continue; ans++; last=p[i].second; } return ans;}int ansL,ansR;int ok(i64 M){ int t=lower_bound(f+1,f+n+1,M)-f; int L=sa[t]; int len=h[t]+M-f[t-1]; ansL=L; ansR=L+len-1; V.clear(); if(L+len
>1; if(ok(M)) ans=min(ans,M),high=M-1; else low=M+1; } ok(ans); print(); }}

 

转载地址:http://hdjax.baihongyu.com/

你可能感兴趣的文章
socketserver模块使用方法
查看>>
json模块
查看>>
各型号英特尔CUP的功率
查看>>
scanf()中的%c 不能正常输入的问题
查看>>
常见排序算法及对应的时间复杂度和空间复杂度
查看>>
业界 | 在德州叫一辆自动驾驶车,Drive.ai安排了7辆无人车展开真实试验
查看>>
实时数据平台设计:解决从OLTP到OLAP实时流转缺失
查看>>
三家公司在SD-WAN方面的新动作
查看>>
C#在PDF中如何以不同颜色高亮文本
查看>>
在同一页面显示多个JavaScript统计图表
查看>>
Mac电脑Tomcat下载及安装(详细)MAC在Eclipse里配置tomcat
查看>>
多线程之-----------定时器
查看>>
C#语法——反射,架构师的入门基础。
查看>>
Beego Models 之 一
查看>>
代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能
查看>>
Kubernetes部署的最佳安全实践
查看>>
理解C语言——从小菜到大神的晋级之路(8)——数组、指针和字符串
查看>>
Windows Shellcode学习笔记——shellcode在栈溢出中的利用与优化
查看>>
关于多线程中使用SendMessage
查看>>
【云栖大会】阿里云移动云Apsara Mobile重磅发布 推出Cloud Native App全新研发范式...
查看>>