P2852 [USACO06DEC]牛奶模式Milk Patterns
link\
这是一道后缀匹配的模板题
我们只需要将height算出来
然后二分一下答案就可以了
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1010000;
int data[maxn];
int rank[maxn];
int tot[maxn];
int sa[maxn];
int pas[maxn];
int len,n,m;
int height[maxn];
int k;
void build_Sa()
{
m=150;
for(int i=0;i<n;i++)
rank[i]=data[i],tot[data[i]]+=1;
for(int i=1;i<=m;i++)
tot[i]+=tot[i-1];
for(int i=n-1;i>=0;i--)
sa[--tot[rank[i]]]=i;
for(int k=1;k<=n;k<<=1)
{
int num=0;
for(int i=n-k;i<n;i++) pas[num++]=i;
for(int i=0;i<n;i++)
if(sa[i]>=k) pas[num++]=sa[i]-k;
for(int i=0;i<=m;i++) tot[i]=0;
for(int i=0;i<n;i++) tot[rank[i]]+=1;
for(int i=1;i<=m;i++) tot[i]+=tot[i-1];
for(int i=n-1;i>=0;i--)
sa[--tot[rank[pas[i]]]]=pas[i],pas[i]=0;
swap(pas,rank);
num=1;rank[sa[0]]=1;
for(int i=1;i<n;i++)
if(pas[sa[i]]!=pas[sa[i-1]]||pas[sa[i]+k]!=pas[sa[i-1]+k])
rank[sa[i]]=++num;
else
rank[sa[i]]=num;
if(num>=n) break;
m=num;
}
}
void build_LCP()
{
int h=0;
/*for(int i=0;i<n;i++) pas[sa[i]]=i;
for(int i=0;i<n;i++)
{
if(!pas[i]) continue;
int j=sa[pas[i]-1];
if(h) h--;
while(data[j+h]==data[i+h]&&j+h<n&&i+h<n) h++;
height[pas[i]]=h;
}*/
for(int i=0;i<n;i++)
{
if(rank[i]-1==0) continue;
int j=sa[rank[i]-2];
if(h) h-=1;
while(j+h<n&&i+h<n)
if(data[j+h]!=data[i+h]) break;
else h+=1;
height[rank[i]]=h;
}
}
bool check(int val)
{
int now=0;
for(int i=0;i<=n;i++)
{
if(height[i]>=val) now+=1;
else now=0;
if(now>=k-1) return true;
}
return false;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) scanf("%d",&data[i]);
int l=1,r=n,mid;
build_Sa();
build_LCP();
while(l+1<r)
{
mid=(l+r)>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
printf("%d", check(r) ? r : l );
}
/*
8 2
1
2
3
2
3
2
3
1
12323231
*/
P2852 [USACO06DEC]牛奶模式Milk Patterns的更多相关文章
- [洛谷P2852] [USACO06DEC]牛奶模式Milk Patterns
洛谷题目链接:[USACO06DEC]牛奶模式Milk Patterns 题目描述 Farmer John has noticed that the quality of milk given by ...
- luogu P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组 + Height数组 + 二分答案 + 扫描
后缀数组有一个十分有趣的性质: $height[rk[i]] >= height[rk[i-1]] - 1$ Code: #include <bits/stdc++.h> #d ...
- Luogu P2852 [USACO06DEC]牛奶模式Milk Patterns
题目链接 \(Click\) \(Here\) 水题.利用\(Height\)的性质维护一个单调栈即可. #include <bits/stdc++.h> using namespace ...
- 【后缀数组】【LuoguP2852】 [USACO06DEC]牛奶模式Milk Patterns
题目链接 题目描述 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". J ...
- [Luogu2852][USACO06DEC]牛奶模式Milk Patterns
Luogu 一句话题意 给出一个串,求至少出现了\(K\)次的子串的最长长度. sol 对这个串求后缀数组. 二分最长长度. 如果有\(K\)个不同后缀他们两两的\(lcp\)都\(>=mid\ ...
- [USACO06DEC] 牛奶模式Milk Patterns
题目链接:戳我 我们知道后缀数组的h数组记录的是后缀i和后缀i-1的最长公共前缀长度,后缀的前缀其实就是子串. 因为是可以重复出现的子串,所以我们只要计算哪些h数组的长度大于等于x即可.这一步操作我们 ...
- 洛谷P2852 牛奶模式Milk Patterns [USACO06DEC] 字符串
正解:SA/二分+哈希 解题报告: 传送门! umm像这种子串的问题已经算是比较套路的了,,,?就后缀的公共前缀这样儿的嘛QwQ 所以可以先求个SA 然后现在考虑怎么判断一个长度为d的子串出现了k次? ...
- 2018.07.17 牛奶模式Milk Patterns(二分+hash)
传送门 一道简单的字符串.这里收集了几种经典做法: SAM,不想写. 后缀数组+二分,不想写 后缀数组+单调队列,不想写 hash+二分,for循哈希,天下无敌!于是妥妥的hash 代码如下: #in ...
- USACO06DEC 牛奶模式
题意:求最长的可重叠的 K重复子串 的长度 考虑二分长度s,转化为验证性问题. 对SA进行分组.保证组内Height最小为s.这样在组内RMQ就可以任意了,因为RMQ一定是大于S的. 只要组内元素个数 ...
随机推荐
- 单元测试框架AndroidTestCase
我不是讲怎么成为一个安卓测试员,就不写那么多了 就写我们常用的, AndroidTestCase 为一Android平台下通用的测试类,它支持所有JUnit的Assert方法和标准的setUp 和te ...
- UI特效资料-----ShaderWeaver
主页:www.shaderweaver.com教程:www.shaderweaver.com/tutorials.html 1.一款插件,挺强大的 ShaderWeaver使用教程-基本操作介绍 ht ...
- lua 遍历table
lua中有四种主要的遍历一个table的方法. 第一种方法: for key, value in pairs(testtb) do xxxx end 这种方法是按照key哈希后的顺序遍历的.比如下面代 ...
- js经验点滴js apply/call/caller/callee/bind使用方法与区别分析
一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). Js代码 call([thisObj[,arg1[, arg2[, ...
- ajax实现的点击数目加1代码实例
ajax实现的点击数目加1代码实例:在点击按钮实现数字增加效果代码实例一章节中,介绍如何点击按钮实现数字加1的效果,但是好像并没有什么实际用处,下面就分享一段相对完整的能够在实际应用中派上用场的代码, ...
- CSS+DIV进度条
<style type="text/css"> .Bar { position: relative; width: 200px; /* 宽度 */ border: 1p ...
- rest-framework框架——认证、权限、频率组件
一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...
- rest-framework框架——解析器、ur控制、分页、响应器、渲染器、版本
一.解析器(parser) 解析器在reqest.data取值的时候才执行. 对请求的数据进行解析:是针对请求体进行解析的.表示服务器可以解析的数据格式的种类. from rest_framework ...
- drupal对数据库操作
// nodenode_load($nid = NULL, $vid = NULL, $reset = FALSE);node_load_multiple($nids = array(), $cond ...
- 2015年创新工场校园招聘软件研发岗位笔试题目——矩阵旋转
题目要求:给出一个NxN的矩阵,写出程序将该矩阵进行顺时针旋转90度 // matrixrotation.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h ...