题目传送门

题意:对一个字符串求一个最长的子串使得它至少出现k次

额,因为这个题目呢,他的字符集非常大(100W)

所以直接用SAM是不行了,我们考虑用离散化+SA,让后就可以分块rmq了

当然这样很麻烦,我们还是用SAM,但是儿子集合用map来存,这样空间就是O(n)的,时间多了一个log

#pragma GCC opitmize("O3")
#pragma G++ opitmize("O3")
#include<map>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 40005
using namespace std;
map<int,int> s[N];
int mx[N],sz[N],f[N],ans=0;
int n,m,lst=1,cnt=1,v[N],r[N];
inline int extend(int c){int p=lst,np=lst=++cnt,q,nq;mx[np]=mx[p]+1; sz[np]=1;for(;p&&!s[p][c];p=f[p]) s[p][c]=np;if(!p) return f[np]=1;q=s[p][c];if(mx[q]==mx[p]+1) f[np]=q;else{nq=++cnt;mx[nq]=mx[p]+1;f[nq]=f[q]; f[q]=f[np]=nq;s[nq]=s[q];for(;p&&s[p][c]==q;p=f[p]) s[p][c]=nq;}
}
int main(){scanf("%d%d",&n,&m);for(int x,i=1;i<=n;++i,extend(x)) scanf("%d",&x);for(int i=1;i<=cnt;++i) ++v[mx[i]];for(int i=1;i<=n;++i) v[i]+=v[i-1];for(int i=cnt;i;--i) r[v[mx[i]]--]=i;for(int i=cnt;i;--i){sz[f[r[i]]]+=sz[r[i]];if(sz[r[i]]>=m) ans=max(ans,mx[r[i]]);}printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/Extended-Ash/p/9477186.html

Poj3261 Milk Patterns相关推荐

  1. [POJ3261] Milk Patterns

    LINK 此题的常规做法是 二分 + 后缀数组 ,但本蒟蒻还是习惯写 并查集 的做法 算法流程 1.离散化是肯定要有的,给的数据太大了,不离散化会RE 2.先跑一遍SA,把最重要的h数组求出来 3.把 ...

  2. [poj3261]Milk Patterns

    求出后缀数组和height数组,然后二分答案后分组查询,一个块内如果有超过k个那么这个答案就可以. 1 #include<bits/stdc++.h> 2 using namespace ...

  3. POJ3261 Milk Patterns 【后缀数组】

    牛奶模式 时间限制: 5000MS   内存限制: 65536K 提交总数: 16796   接受: 7422 案件时间限制: 2000MS 描述 农夫约翰已经注意到,他的牛奶的质量每天都在变化.经进 ...

  4. P2852 [USACO06DEC]Milk Patterns G

    题目描述 Farmer John has noticed that the quality of milk given by his cows varies from day to day. On f ...

  5. 后缀数组2.0--Height数组(bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式)

    前置技能:后缀数组 height[i]:排名第i的后缀与排名第i-1的后缀的最长公共前缀,也就是sa[i]和sa[i-1]的最长公共前缀 h[i]:以第i个字符为起点的后缀与排名在它前1名的后缀的最长 ...

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

    先求后缀数组.相邻两个后缀的最长公共前缀 二分答案,o(n)check 1 #include<algorithm> 2 #include<iostream> 3 #includ ...

  7. 【USACO06DEC】—牛奶模式Milk Patterns(后缀自动机)

    传送门 后缀自动机板子题了吧 只需要求Parent−TreeParent-TreeParent−Tree上非叶子节点的最长的lenlenlen就可以了 因为字符集太大又不想离散化 就直接用mapmap ...

  8. POJ - 3261 Milk Patterns(二分+后缀数组)

    题目链接:点击查看 题目大意:给出一个字符串,以及一个k,现在求出现次数大于等于k次的最大可重叠子串的长度 题目分析:可以说是后缀数组的模板题目了吧..直接跑出height数组,因为height数组代 ...

  9. poj 3261 Milk Patterns 后缀数组 最长重复子串

    http://poj.org/problem?id=3261 给一串数组,数组最少含有k个相同子串,可重叠,求这样子串的最长长度. 后缀数组求出 height[],若连续k个height[]都大于mi ...

最新文章

  1. 长波通信、中波通信、短波通信、超短波通信与微波通信介绍
  2. 常用的相似性度量(距离总结)
  3. librtmp协议分析---RTMP_SendPacket函数
  4. php导出页面居中设置,PHPExcel导出插入图片和居中问题
  5. dbm和mysql使用场景_mysql基本用法总结
  6. php(2)—基础补充
  7. 如何抓取Camera systrace
  8. 华为服务器u盘装linux_华为matebook14双系统(deepin15.11+win10)新体验!
  9. 【转载】Gradle命令行黑魔法
  10. 关于账号密码校验的两种IO流操作
  11. 01-artDialog4.1.7常用整理
  12. 用文本挖掘剖析近5万首《全唐诗》
  13. python像数常用函数_八卦象数疗法常见配方
  14. dalao自动报表邮件2.0
  15. python 实现问卷星自动填写多份
  16. layui使用初步入门
  17. 分享一个:批量下载个性化桌面壁纸和各种唯美图片的方法
  18. 循环结构习题:公式求π值
  19. 企业邮箱登录入口,邮箱登陆登录入口有哪些?
  20. 7-36 大炮打蚊子(15 分)

热门文章

  1. 热释电传感器三个引脚_Adafruit的树莓派教程:热释电传感器感知运动
  2. 分布式事务是啥?常用的解决方案有哪些?
  3. Solr+Hbase多条件查(优劣互补)
  4. strace命令用法
  5. eclipse中web工程调试出现404的问题
  6. sagan 自注意力_请使用英语:自我注意生成对抗网络(SAGAN)
  7. Android USB 属性设置:ADB、RNDIS、MTP等
  8. 现在是不是很多人都不愿意在银行存钱?
  9. 被冻结的钱,银行可以私自处理吗?
  10. PHP的表单获取与HHTP请求方式