正解:SA/二分+哈希

解题报告:

传送门!

umm像这种子串的问题已经算是比较套路的了,,,?就后缀的公共前缀这样儿的嘛QwQ

所以可以先求个SA

然后现在考虑怎么判断一个长度为d的子串出现了k次?这儿可以直接判断是否有连续的k个hei[i]>=d,因为已经按字典序排序了,所以只要有连续的k个hei[i]>=d就一定有长度大于等于d的子串出现k次

所以二分了check一下就好

然后再说说二分+哈希的做法趴QwQ

就先二分一个长度d,然后把所有长度为d的子串的哈希值求出来,排个序之后判断有没有一个哈希值出现次数>=d

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ll long long
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=1e6+,inf=1e9;
int x[N],y[N],sa[N],rk[N],hei[N],t[N],n,K,ch[N],l,r; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:x;
}
il bool check(ri gd,ri gs,ri k){return y[gd]==y[gs] && y[gd+k]==y[gs+k];}
il void SA()
{
ri m=N-;
rp(i,,n)++t[x[i]=ch[i]];
rp(i,,m)t[i]+=t[i-];
my(i,n,)sa[t[x[i]]--]=i;
for(ri k=;k<=n;k<<=)
{
ri p=;
rp(i,,m)t[i]=;rp(i,,n)y[i]=;
rp(i,n-k+,n)y[++p]=i;rp(i,,n)if(sa[i]>k)y[++p]=sa[i]-k;
rp(i,,n)++t[x[y[i]]];
rp(i,,m)t[i]+=t[i-];
my(i,n,)sa[t[x[y[i]]]--]=y[i];
swap(x,y);
x[sa[]]=p=;
rp(i,,n)x[sa[i]]=check(sa[i],sa[i-],k)?p:++p;
if(p>=n)break;
m=p;
}
rp(i,,n)rk[sa[i]]=i;
ri h=;
rp(i,,n)
{
if(h)--h;
while(ch[i+h]==ch[sa[rk[i]-]+h])++h;
hei[rk[i]]=h;r=max(r,h);
}
}
il bool jud(ri x)
{
ri cnt=;
rp(i,,n){if(hei[i]<x)cnt=;else ++cnt;if(cnt==K-)return true;}return false;
} int main()
{
// freopen("2852.in","r",stdin);freopen("2852.out","w",stdout);
n=read();K=read();rp(i,,n)ch[i]=read();SA();r=n;
while(l<r){ri mid=(l+r)>>;if(jud(mid+))l=mid+;else r=mid;}
printf("%d\n",l);
return ;
}

啊我麻油写二分+哈希,,,就写了个SA的代码QwQ

洛谷P2852 牛奶模式Milk Patterns [USACO06DEC] 字符串的更多相关文章

  1. [洛谷P2852] [USACO06DEC]牛奶模式Milk Patterns

    洛谷题目链接:[USACO06DEC]牛奶模式Milk Patterns 题目描述 Farmer John has noticed that the quality of milk given by ...

  2. luogu P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组 + Height数组 + 二分答案 + 扫描

    后缀数组有一个十分有趣的性质: $height[rk[i]] >= height[rk[i-1]] - 1$    Code: #include <bits/stdc++.h> #d ...

  3. Luogu P2852 [USACO06DEC]牛奶模式Milk Patterns

    题目链接 \(Click\) \(Here\) 水题.利用\(Height\)的性质维护一个单调栈即可. #include <bits/stdc++.h> using namespace ...

  4. P2852 [USACO06DEC]牛奶模式Milk Patterns

    link 这是一道后缀匹配的模板题 我们只需要将height算出来 然后二分一下答案就可以了 #include<cstdio> #include<algorithm> #inc ...

  5. 【后缀数组】【LuoguP2852】 [USACO06DEC]牛奶模式Milk Patterns

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

  6. [Luogu2852][USACO06DEC]牛奶模式Milk Patterns

    Luogu 一句话题意 给出一个串,求至少出现了\(K\)次的子串的最长长度. sol 对这个串求后缀数组. 二分最长长度. 如果有\(K\)个不同后缀他们两两的\(lcp\)都\(>=mid\ ...

  7. [USACO06DEC] 牛奶模式Milk Patterns

    题目链接:戳我 我们知道后缀数组的h数组记录的是后缀i和后缀i-1的最长公共前缀长度,后缀的前缀其实就是子串. 因为是可以重复出现的子串,所以我们只要计算哪些h数组的长度大于等于x即可.这一步操作我们 ...

  8. 2018.07.17 牛奶模式Milk Patterns(二分+hash)

    传送门 一道简单的字符串.这里收集了几种经典做法: SAM,不想写. 后缀数组+二分,不想写 后缀数组+单调队列,不想写 hash+二分,for循哈希,天下无敌!于是妥妥的hash 代码如下: #in ...

  9. 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】

    题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...

随机推荐

  1. FilenameFilter总结

    一.FilenameFilter介绍   java.io.FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件: 一般地: (1)String[] fs = f.l ...

  2. php中urlencode和urldecode的用法

    URLEncode:是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu.Google等搜索引擎中输入中文查询时候,生成经过Encode过的网页URL.URLEncode的方式一般 ...

  3. [Python] 00 - Books

    A.I. & Optimization Advanced Machine Learning, Data Mining, and Online Advertising Services Ref: ...

  4. 如何处理MySQL每月5亿的数据

    第一阶段:1,一定要正确设计索引2,一定要避免SQL语句全表扫描,所以SQL一定要走索引(如:一切的 > < != 等等之类的写法都会导致全表扫描)3,一定要避免 limit 100000 ...

  5. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V2 -- 对象传输

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- 使用序列化和反序列化在网络上传输对象:需要实现 java.io.Serializable 接口 只能传输( ByteBuf ...

  6. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验四:按键模块③ — 单击与双击

    实验四:按键模块③ - 单击与双击 实验三我们创建了"点击"还有"长点击"等有效按键的多功能按键模块.在此,实验四同样也是创建多功能按键模块,不过却有不同的有效 ...

  7. 高斯混合模型 GMM

    本文将涉及到用 EM 算法来求解 GMM 模型,文中会涉及几个统计学的概念,这里先罗列出来: 方差:用来描述数据的离散或波动程度. \[var(X) =  \frac{\sum_{i=1}^N( X_ ...

  8. com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'id' at row 1

    1.存储的值超过了字段长度.调整数据库中的字段长度 2,变更字段字符集编码为utf8

  9. int main(int argc,char *argv[])与int main(int argc,char **argv)区别?

    int main(int argc,char *argv[])与int main(int argc,char **argv)区别? 这两种是一个等价的写法 而int main(int argc,cha ...

  10. 如何移植freertos

    要素: 1.两个主要的文件夹移动 2.freertos_config 复制,决定了系统时钟启动位置 3. 启动汇编复制替换 4.it中断管理文件 的相关三个中断注释掉 5.复制delay文件,主要是s ...