【bzoj1717】Milk Patterns 后缀数组 + (二分||单调队列)
来源:互联网 发布:数据分析师学历 编辑:程序博客网 时间:2024/05/17 06:54
这题看完之后想用单调队列……结果调了一个下午……
DQS学长看了几秒钟之后说是可以二分……
然后……
OrzOrzOrz
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <queue>#include <stack>using namespace std;const int MAXN = 100000 + 5;int sa[MAXN],rank[MAXN],tmp[MAXN];int n,m,k;int c[MAXN];bool cmp_sa(int a,int b){ if(rank[a] != rank[b]) return rank[a] < rank[b]; else { int x = a + k <= n ? rank[a + k] : -1; int y = b + k <= n ? rank[b + k] : -1; return x < y; }}void make_sa(int s[]){ for(int i = 0;i <= n;i ++) { rank[i] = i < n ? s[i] : -1; sa[i] = i; } for(k = 1;k <= n;k <<= 1) { sort(sa,sa + n + 1,cmp_sa); tmp[sa[0]] = 0; for(int i = 1;i <= n;i ++) tmp[sa[i]] = tmp[sa[i - 1]] + cmp_sa(sa[i - 1],sa[i]); for(int i = 0;i <= n;i ++) rank[i] = tmp[i]; } return;}int lcp[MAXN];void make_lcp(int s[]){ for(int i = 1;i < n;i ++) rank[sa[i]] = i; int h = 0; lcp[0] = 0; for(int i = 0;i < n;i ++) { int j = sa[rank[i] - 1]; if(h) h--; for(;i + h < n,j + h < n;h ++) if(s[i + h] != s[j + h]) break; lcp[rank[i] - 1] = h; } return;}bool can(int x){ int ans = 0,num = 0; for(int i = 1;i <= n;i ++) { num = (num + 1) * (lcp[i] >= x); ans = max(num,ans); } return ans >= m - 1;}int div(){ int ans; int l = 1,r = n; while(l <= r) { int mid = (l + r) >> 1; if(can(mid)) ans = mid,l = mid + 1; else r = mid - 1; } return ans;}int main(){ scanf("%d %d",&n,&m); for(int i = 0;i < n;i ++) scanf("%d",&c[i]); make_sa(c); make_lcp(c); printf("%d\n",div()); return 0;}
D(y)Q(d)S(c):“一般后缀数组或者高度数组都是套个二分什么的,把lcp数组切成一块一块的之后就可以简单的验证了……”
%%%
0 0
- 【bzoj1717】Milk Patterns 后缀数组 + (二分||单调队列)
- bzoj1717(poj3261) [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组,二分答案)
- POJ3261---Milk Patterns(后缀数组+二分)
- [BZOJ1717]-[Usaco2006 Dec]Milk Patterns-后缀数组Height模板题
- [BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
- [BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)
- POJ 3261 Milk Patterns(二分+后缀数组)
- POJ 3261 Milk Patterns(后缀数组+二分)
- POJ 3261 Milk Patterns (后缀数组 + 二分)
- POJ 3261 Milk Patterns(二分+后缀数组)
- Milk Patterns+POJ+后缀数组+二分
- POJ 3261 Milk Patterns 后缀数组+二分
- 【POJ3261】Milk Patterns【后缀数组】【二分】
- 【poj3261】Milk Patterns 后缀数组+二分
- poj 3261 Milk Patterns 后缀数组 二分
- 【poj 3261】Milk Patterns 二分+后缀数组
- poj 3261 Milk Patterns 后缀数组+二分
- poj3261 Milk Patterns 后缀数组+二分
- Two-Stream Convolutional Networks for Action Recognition in Video
- 入侵检测基础知识
- hdoj 1418 抱歉 【欧拉公式】
- 四大类NoSQL数据库
- Android View 的弹性滑动: Scroller使用说明
- 【bzoj1717】Milk Patterns 后缀数组 + (二分||单调队列)
- 关于 多进程epoll 与 “惊群”问题
- Java I/O学习(附实例和详解)
- 代码基本框架
- Java 引用类解析
- 校内欢乐赛之爆零季 POJ 1904
- RecycleView出现折叠效果
- 项目:漫漫H5游戏-抓娃娃机
- CF 626B【讨论所有情况】