http://poj.org/problem?id=3261

题意:一个长度为n的串,要求最长的子串的长度且这个子串的出现次数不少于k次。(1<=n<=20000, 2<=k<=n)

#include <cstdio>
#include <algorithm>
using namespace std; const int N=20015;
void sort(int *x, int *y, int *sa, int n, int m) {
static int c[N], i;
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];
}
void hz(int *r, int *sa, int n, int m) {
static int t1[N], t2[N];
static int *x, *y, *t, j, i, p=0;
x=t1; y=t2;
for(i=0; i<n; ++i) x[i]=r[i], y[i]=i;
sort(x, y, sa, n, m);
for(j=1, p=1; p<n; j<<=1, m=p) {
p=0;
for(i=n-j; i<n; ++i) y[p++]=i;
for(i=0; i<n; ++i) if(sa[i]-j>=0) y[p++]=sa[i]-j;
sort(x, y, sa, n, m);
for(t=x, x=y, y=t, x[sa[0]]=0, p=1, i=1; i<n; ++i)
x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+j]==y[sa[i-1]+j]?p-1:p++;
}
}
void geth(int *a, int *sa, int *rank, int *h, int n) {
static int k, i, j; k=0;
for(i=1; i<=n; ++i) rank[sa[i]]=i;
for(i=1; i<=n; h[rank[i++]]=k)
for(k?--k:0, j=sa[rank[i]-1]; a[i+k]==a[j+k]; ++k);
}
const int oo=~0u>>2;
int sa[N], rank[N], h[N], n, a[N], b[N], K;
bool check(int k) {
int cnt=1;
for(int i=2; i<=n; ++i) {
if(h[i]>=k) {
++cnt;
if(cnt>=K) return 1;
}
else cnt=1;
}
if(cnt>=K) return 1;
return 0;
}
int mp[1000005];
int main() {
scanf("%d%d", &n, &K);
for(int i=1; i<=n; ++i) scanf("%d", &a[i]), b[i]=a[i];
sort(b+1, b+1+n);
int tot=unique(b+1, b+1+n)-b-1;
for(int i=1; i<=tot; ++i) mp[b[i]]=i;
for(int i=1; i<=n; ++i) a[i]=mp[a[i]];
hz(a, sa, n+1, 200);
geth(a, sa, rank, h, n);
int mid, l=0, r=n;
while(l<=r) {
mid=(l+r)>>1;
if(check(mid)) l=mid+1;
else r=mid-1;
}
printf("%d\n", l-1);
return 0;
}

  


经典题...同样是分组height...将高度>=二分值的分在一组,然后判断是否有大于等于K个元素即可

最新文章

  1. Module-Zero之版本管理
  2. 11月7日上午PHP会话控制(session和cookie)、跨页面传值
  3. [转]Navicat for MySQL快捷键
  4. 【转】常用css命名规则
  5. Android高手进阶:Adapter深入理解与优化
  6. ASP.NET MVC 入门2、项目的目录结构与核心的DLL
  7. Android 最热的高速发展框架XUtils
  8. androidstudio 问题
  9. session锁问题
  10. Machine Learning &amp;&amp;Deep Learning&amp;&amp;Sklearn
  11. sort学习 - LeetCode #406 Queue Reconstruction by Height
  12. bootice-diskinfo参数
  13. 《转》完美解决微信video视频隐藏控件和内联播放问题
  14. ubuntu下opencv的版本切换及遇到的问题解决
  15. 关于jsp中jstl-core标签循环遍历的使用
  16. 虚拟机linux系统明明已经安装了ubuntu,但是每次重新进入就又是选择安装界面
  17. abap test msg
  18. PHP APP端微信支付
  19. HDU 1059(多重背包加二进制优化)
  20. Hadoop RPC protocol description--转

热门文章

  1. Powershell常用命令
  2. FZU 1649 Prime number or not米勒拉宾大素数判定方法。
  3. Tornaod框架
  4. 细微之处:比较两种CSS清除浮动的兼容
  5. jstack命令详解
  6. BestCoder14 1002.Harry And Dig Machine(hdu 5067) 解题报告
  7. SGU 106 The equation
  8. POJ 3904 Sky Code (容斥原理)
  9. Mac 安装Java JDK
  10. Shallow Size 和 Retained Size