以后似乎终于不用去学后缀数组的倍增搞法||DC3等blablaSXBK的方法了= =

定义(来自关于后缀数组的那篇国家集训队论文。。)

后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列SA[1],SA[2],……,SA[n],并且保证Suffix(SA[i])<Suffix(SA[i+1]),1≤i<n。

     也就是将S的n个后缀从小到大进行排序之后把排好序的后缀的开头位置顺次放入SA中。

height数组:定义height[i]=suffix(sa[i-1])和suffix(sa[i])的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀。

接着是许昊然在《数据结构漫谈》中的讲解//原谅我不知道复制文字的正确技巧QAQ

听起来(而且事实上)的确挺简单的= =

最感人的是反正前面复杂度都已经O(n log²n)了。。。后面就随便玩了反正超时了也是前面的锅。。。

然而复杂度实在是有点虚。。。虽然本题n才2w,但是OJ上跑了600+ms。。。。。似乎还是数据随机的情况下

如果是较极限的数据(似乎没什么区别。。)的话10w的数据范围学校机子要跑3s。。。。

然后删掉取模,让它自然溢出的话似乎大概也许可能是在1s内跑出来的吧。。。。。。。。事实证明n=10w时要1.5s左右= =QAQ//学校机子1s内能循环2亿次= =

综上。。。我选择相信测评姬(捂脸

SA数组和height数组造出来后这题就是《后缀数组——处理字符串的有力工具》里面的例题了= =

诶好像有点详略不当

引用部分原文:

  先二分答案为mid,把题目变成判定性问题。

    解决这个问题的关键还是利用height数组。把排序后的后缀分成若干组,其中每组的后缀之间的height值都不小于mid(最长公共前缀长度不小于mid的两个后缀一定在同一组)。

    判断有没有一个组的后缀个数不小于k即可。

傻逼代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=20012;
struct zs{int pos;
}sa[maxn];
int s[maxn];
ll pre[maxn],modd,jc[maxn],val1,val2;
int l,r,mid,i,j,k,n,m,now,nowlen,K;
int h[maxn];
inline int getlen(int s1,int s2){//求两后缀(分别从s1,s2开始)的最长公共前缀的长度 if(s[s1]!=s[s2])return 0;int l=1,r=n-max(s1,s2)+1,mid;while(l<r){mid=(l+r+1)>>1;val1=pre[s1+mid-1]-pre[s1-1]*jc[mid]%modd;val2=pre[s2+mid-1]-pre[s2-1]*jc[mid]%modd;if(val1<0)val1+=modd;if(val2<0)val2+=modd;if(val1==val2)l=mid;else r=mid-1;}return l;
}
inline bool bigger(int s1,int s2){if(s[s1]!=s[s2])return s[s1]>s[s2];int len=getlen(s1,s2);if(len==n-max(s1,s2)+1)return s1<s2;return s[s1+len]>s[s2+len];
}
bool cmp(zs a,zs b){return !bigger(a.pos,b.pos);
}
int main(){scanf("%d%d",&n,&K);for(i=1;i<=n;i++)scanf("%d",&s[i]);modd=1233333333;jc[0]=1;for(i=1;i<=n;i++)jc[i]=jc[i-1]*197%modd,pre[i]=(pre[i-1]*197%modd+s[i])%modd;/for(i=1;i<=n;i++)sa[i].pos=i;sort(sa+1,sa+1+n,cmp);for(i=2;i<=n;i++)h[i]=getlen(sa[i].pos,sa[i-1].pos);l=0;r=n;while(l<r){mid=(l+r+1)>>1;now=1;nowlen=0;for(i=2;i<=n+1&&nowlen<K;i++)if(h[i]<mid)nowlen=max(nowlen,i-now),now=i;if(nowlen<K)r=mid-1;else l=mid;}printf("%d\n",l);return 0;
}

View Code

转载于:https://www.cnblogs.com/czllgzmzl/p/4989723.html

[bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式 (hash构造后缀数组,二分答案)相关推荐

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

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

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

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

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

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

  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. bzoj 1650: [Usaco2006 Dec]River Hopscotch 跳石子(二分)

    1650: [Usaco2006 Dec]River Hopscotch 跳石子 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 721  Solved: ...

  6. bzoj 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐(暴力DFS)

    1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 774  Solved: 480 ...

  7. 乳牛悲惨的一生 -----奶牛为什么会产奶?

    http://www.douban.com/group/topic/17241189/ 奶牛为什么怀孕呢? --因为,因为她被人工受精了!奶牛为什么会不断地产奶呢?因为她不断地生小牛.奶牛为什么不断地 ...

  8. POJ3261 Milk Patterns 【后缀数组】

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

  9. bzoj 1640 bzoj 1692: [Usaco2007 Dec]队列变换(后缀数组)

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1756  Solved: 737 [Submit][ ...

最新文章

  1. store 存取数据数组对象_ios – 如何在数组中保存自定义对象并将其存储在NSUserDefaults – iPhone中...
  2. 更改日期为英文_如何在 Linux 上检查所有用户密码到期日期 | Linux 中国
  3. JZOJ 5490. 【清华集训2017模拟11.28】图染色
  4. MIPS 通用寄存器
  5. 字体大宝库:设计师必备的专业免费英文字体
  6. 支持Dubbo生态发展,阿里巴巴启动新的开源项目 Nacos
  7. 飞秋 一个程序员的老作品。
  8. 微信小程序request:fail invalid url
  9. web前端之js快速入门(BOM和DOM)
  10. Windows环境下使用CMake编译OpenCV3.0和OpenCV_contrib
  11. java基础杂谈(一)
  12. 专业书籍阅读-Earth System Science Data Resources
  13. mysql 命令查看sql文件大小_用SQL命令查看Mysql数据库大小
  14. 【读书笔记】2_增强学习中的Q-Learning
  15. 阿里云环境迁移记录 - RabbitMQ集群搭建
  16. 车牌自动识别在智能交通系统中的应用及前景分析
  17. w7计算机应用放大按键,设置Win7放大功能 老年人用电脑更方便
  18. 成功解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“
  19. ChatGpt:OpenAI 最近推出了一款聊天AI ——ChatGPT
  20. 了解《诗歌生成》必看的6篇论文【附打包下载地址】

热门文章

  1. 【孤偏盖全唐】Linux中find命令完整用法
  2. ‘telnet‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
  3. 白皮书 | 以太坊 (Ethereum ):下一代智能合约和去中心化应用平台
  4. vnpy通过jqdatasdk初始化实时数据及历史数据下载
  5. 配置csrf_django 入门第一课 配置文件
  6. sql 临时表_深度分析 | JDBC与MySQL临时表空间的分析
  7. netty支持哪些协议_从零学习netty网络IO通讯开发框架
  8. cass读取dat文件_CASS里DTM法土方计算
  9. 力扣 双周赛补题 2086. 从房屋收集雨水需要的最少水桶数
  10. 安卓马赛克view_Android马赛克效果MosaicView