1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 1469  Solved: 799
[Submit][Status][Discuss]

Description

农夫John发现他的奶牛产奶的质量一直在变动。经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠。我们称之为一个“模式”。 John的牛奶按质量可以被赋予一个0到1000000之间的数。并且John记录了N(1<=N<=20000)天的牛奶质量值。他想知道最长的出现了至少K(2<=K<=N)次的模式的长度。比如1 2 3 2 3 2 3 1 中 2 3 2 3出现了两次。当K=2时,这个长度为4。

Input

* Line 1: 两个整数 N,K。

* Lines 2..N+1: 每行一个整数表示当天的质量值。

Output

* Line 1: 一个整数:N天中最长的出现了至少K次的模式的长度

Sample Input

8 2
1
2
3
2
3
2
3
1

Sample Output

4

题意

给定一个字符串,求至少出现k次可重叠最长重复子串

分析

后缀数组求出height(排名相邻的两个后缀的公共前缀),二分长度,在height中O(n)判断。

要求有连续k-1个height的值大于等于当前二分的长度才可以。

时间复杂度O(nlogn)

直接二分+hash也可以,复杂度相同

code

 #include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int N = ; int s[N];
int t1[N],t2[N],c[N],sa[N],height[N],rank[N];
int n,m = ,k; void get_sa() {
int i,p,*x = t1,*y = t2;
for (i=; i<m; ++i) c[i] = ;
for (i=; i<n; ++i) x[i] = s[i],c[x[i]]++;
for (i=; i<m; ++i) c[i] += c[i-];
for (i=n-; i>=; --i) sa[--c[x[i]]] = i;
for (int k=; k<=n; k<<=) {
p = ;
for (i=n-k; i<n; ++i) y[p++] = i;
for (i=; i<n; ++i) if(sa[i]>=k) y[p++]=sa[i]-k;
for (i=; i<m; ++i) c[i] = ;
for (i=; i<n; ++i) c[ x[y[i]] ]++;
for (i=; i<m; ++i) c[i] += c[i-];
for (i=n-; i>=; --i) sa[--c[ x[y[i]] ]] = y[i];
swap(x,y);
p = ;
x[sa[]] = ;
for (i=; i<n; ++i)
x[sa[i]] = (y[sa[i-]]==y[sa[i]] && sa[i-]+k<n && sa[i]+k<n &&
y[sa[i-]+k]==y[sa[i]+k]) ? p- : p++;
if (p>=n) break;
m = p;
}
}
void get_height() {
for (int i=; i<n; ++i) rank[sa[i]] = i;
int k = ;
height[] = ;
for (int i=; i<n; ++i) {
if (!rank[i]) continue;
if (k) k--;
int j = sa[rank[i]-];
while (i+k<n && j+k<n && s[i+k]==s[j+k]) k++;
height[rank[i]] = k;
}
}
bool check(int x) {
int num = ;
for (int i=; i<n; ++i) {
if (height[i] >= x) {
num ++;
if (num == k-) return true;
}
else num = ;
}
return false;
}
int main () {
scanf("%d%d",&n,&k);
for (int i=; i<n; ++i) scanf("%d",&s[i]);
get_sa();
get_height();
int L = ,R = n,mid,ans;
while (L <= R) {
mid = (L + R) >> ;
if (check(mid)) ans = mid,L = mid + ;
else R = mid - ;
}
printf("%d",ans);
return ;
}

1717: [Usaco2006 Dec]Milk Patterns 产奶的模式的更多相关文章

  1. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1017  Solved: ...

  2. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )

    二分答案m, 后缀数组求出height数组后分组来判断. ------------------------------------------------------------ #include&l ...

  3. BZOJ#1717:[Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组+单调队列)

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的 ...

  4. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

    Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". ...

  5. 【刷题】BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式

    Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". ...

  6. BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)

    [题目链接]http://www.lydsy.com/JudgeOnline/problem.php?id=1717 [题目大意] 求一个最长的串,使得其在母串中出现的次数达到要求 [题解] 二分答案 ...

  7. 【bzoj】1717 [Usaco2006 Dec]Milk Patterns 产奶的模式

    [算法]后缀数组 [题解]后缀数组 由于m太大,先离散化. 然后处理SA和LCP. 最后用单调队列处理即可. 注意实际上队列头尾长度限制是K-1. 删队尾不要删过头 i≥K才能开始统计答案. #inc ...

  8. bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式【后缀自动机】

    就是后缀自动机的板子嘛..构造完自动机之后拓扑一下,记录size,对于size大于k的点和ans取max #include<iostream> #include<cstdio> ...

  9. bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

    后缀数组+二分答案+离散化.(上次写的时候看数据小没离散化然后一直WA...写了lsj师兄的写法. #include<cstdio> #include<cstring> #in ...

随机推荐

  1. synchronized重入后抛出异常,锁释放了吗

    synchronized: 用于同步方法或者代码块,使得多个线程在试图并发执行同一个代码块的时候,串行地执行.以达到线程安全的目的. 允许重入: 在多线程的时候是这样的,但是对于单线程,是允许重入的, ...

  2. springboot+Jsp部署linux

    这个springboot部署到linux,我之前一直都是在linux上使用tomcat部署,但是这样部署容易出现EL表达式无法使用导致项目报错:后来发现了一种更简单的方法,就是将项目打成war包,注册 ...

  3. javascript浮点值运算舍入误差

    问题 在javascript中整数和浮点数都属于Number数据类型(简单数据类型中的一种),我们经常会发现在打印1.0这样的浮点数的结果是1而非1.0,这是由于保存浮点数的内存空间是保存整数值的两倍 ...

  4. Invoke 和 BeginInvoke 的区别(转发)

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...

  5. pta 编程题12 堆中的路径

    其它pta数据结构编程题请参见:pta 这道题考察的是最小堆. 堆是一个完全二叉树,因此可用数组表示,一个下标为 i 的结点的父节点下标为 i / 2,子结点下标为 2i 和 2i + 1. 插入元素 ...

  6. POJ 3050 Hopscotch(dfs,stl)

    用stack保存数字,set判重.dfs一遍就好.(或者编码成int,快排+unique #include<cstdio> #include<iostream> #includ ...

  7. Android(java)学习笔记152:采用get请求提交数据到服务器(qq登录案例)

    1.GET请求:    组拼url的路径,把提交的数据拼装url的后面,提交给服务器. 缺点:(1)安全性(Android下提交数据组拼隐藏在代码中,不存在安全问题)  (2)长度有限不能超过4K(h ...

  8. Android(java)学习笔记96:layout_weight使用注意事项

    1. android:layout_weight使用说明: layout_weight是权重的意思,也就是各个控件所占的比重,用在LinearLayout布局中.当我们使用layout_weight的 ...

  9. 【BZOJ2006】[NOI2010] 超级钢琴(堆+RMQ)

    点此看题面 大致题意: 要你求出区间和前\(k\)大的区间的区间和之和,其中每个区间的大小在\(L\)与\(R\)之间. 堆+\(RMQ\) 这道题目,我们可以先对\(1\sim n\)中的每一个\( ...

  10. python实现剑指offer删除链表中重复的节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...