Milk Patterns POJ - 3261 后缀数组
Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation, he discovered that although he can't predict the quality of milk from one day to the next, there are some regular patterns in the daily milk quality.
To perform a rigorous study, he has invented a complex classification scheme by which each milk sample is recorded as an integer between 0 and 1,000,000 inclusive, and has recorded data from a single cow over N (1 ≤ N ≤ 20,000) days. He wishes to find the longest pattern of samples which repeats identically at least K (2 ≤ K ≤ N) times. This may include overlapping patterns -- 1 2 3 2 3 2 3 1 repeats 2 3 2 3 twice, for example.
Help Farmer John by finding the longest repeating subsequence in the sequence of samples. It is guaranteed that at least one subsequence is repeated at least K times.
Input
Lines 2..
N+1:
N integers, one per line, the quality of the milk on day
i appears on the
ith line.
Output
K times
Sample Input
8 2
1
2
3
2
3
2
3
1
Sample Output
4
1 /*
2 题意:
3 给你一个长度为n的序列,你要找到重复相同至少K(2≤K≤N)次的样本的最长模式。输出最长是多少(这k次样本可以重叠一部分)
4
5 题解:
6 这道题原来我是想这先用后缀数组求出来height数组之后,然后只需要在height[i...n]这个范围内找到范围为m,使这个范围内的
7 最小值尽可能大就行
8 相当于滑动窗口,但是这个窗口的宽度是可变的(根据题目输入)
9 然后我就发现了这个问题总是在询问一个范围内的最小值,感觉可用线段树。虽然每次询问耗时使log(n),但是要询问好多次,总复杂度
10 相当于nlog(n),感觉还不行
11
12 百度一发,可以用二分枚举最后答案,然后判断一下这个答案可以不就可以了
13 怎么判断?
14 你只需要找出来height数组中连着的m-1个height值都大于你二分枚举出来那个值就行
15
16 */
17 #include <cstdlib>
18 #include <cstring>
19 #include <cstdio>
20 #include <algorithm>
21 using namespace std;
22
23 const int N = 200000+9;
24 int x[N], y[N], c[N];
25 int rank[N], height[N];
26 int sa[N],s[N],n,k;
27 bool pan(int *x,int i,int j,int k,int n)
28 {
29 int ti=i+k<n?x[i+k]:-1;
30 int tj=j+k<n?x[j+k]:-1;
31 return x[i]==x[j]&&ti==tj;
32 }
33 void build_SA(int n,int r)
34 {
35 int *x=rank,*y=height;
36 for(int i=0; i<r; i++)c[i]=0;
37 for(int i=0; i<n; i++)c[s[i]]++;
38 for(int i=1; i<r; i++)c[i]+=c[i-1];
39 for(int i=n-1; i>=0; i--)sa[--c[s[i]]]=i;
40 r=1;
41 x[sa[0]]=0;
42 for(int i=1; i<n; i++)
43 x[sa[i]]=s[sa[i]]==s[sa[i-1]]?r-1:r++;
44 for(int k=1; r<n; k<<=1)
45 {
46 int yn=0;
47 for(int i=n-k; i<n; i++)y[yn++]=i;
48 for(int i=0; i<n; i++)
49 if(sa[i]>=k)y[yn++]=sa[i]-k;
50 for(int i=0; i<r; i++)c[i]=0;
51 for(int i=0; i<n; i++)++c[x[y[i]]];
52 for(int i=1; i<r; i++)c[i]+=c[i-1];
53 for(int i=n-1; i>=0; i--)sa[--c[x[y[i]]]]=y[i];
54 swap(x,y);
55 r=1;
56 x[sa[0]]=0;
57 for(int i=1; i<n; i++)
58 x[sa[i]]=pan(y,sa[i],sa[i-1],k,n)?r-1:r++;
59 }
60 for(int i=0; i<n; i++)rank[i]=x[i];
61 }
62 void get_height(int n)
63 {
64 int i,j,k=0;
65 for(i=1; i<=n; i++)rank[sa[i]]=i;
66 for(i=0; i<n; i++)
67 {
68 if(k)k--;
69 else k=0;
70 j=sa[rank[i]-1];
71 while(s[i+k]==s[j+k])k++;
72 height[rank[i]]=k;
73 }
74 }
75 int check(int len)
76 {
77 int i=2,cnt=0;
78 while(1)
79 {
80 while(i<=n && height[i]>=len)
81 cnt++,i++;
82 if(cnt+1>=k)return 1;
83 if(i>=n)return 0;
84 while(i <=n &&height[i]<len)
85 i++;
86 cnt=0;
87 }
88 }
89
90 int main()
91 {
92 scanf("%d%d",&n,&k);
93 for(int i=0; i<n; i++)
94 scanf("%d",&s[i]),s[i]++;
95 s[n]=0;
96
97 build_SA(n+1,N);
98 get_height(n);
99 int l=1,r=n,ans=1,mid;
100 while(l<=r)
101 {
102 mid=(l+r)/2;
103 if(check(mid))
104 l=mid+1,ans=mid;
105 else
106 r=mid-1;
107 }
108 printf("%d\n",ans);
109 return 0;
110 }
Milk Patterns POJ - 3261 后缀数组的更多相关文章
- Milk Patterns POJ - 3261(后缀数组+二分)
题意: 求可重叠的最长重复子串,但有一个限制条件..要至少重复k次 解析: 二分枚举k,对于连续的height 如果height[i] >= k 说明它们至少有k个元素是重复的,所以判断一下就好 ...
- POJ 3261 后缀数组
题目链接:http://poj.org/problem?id=3261 题意:约翰注意到奶牛产奶的之类是不断变化的,虽然他不能预测从当天到下一天的变化情况但是他知道变化是有规律的,牛奶的质量由一个整数 ...
- poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)
题目:http://poj.org/problem?id=3261 仍然是后缀数组的典型应用----后缀数组+lcp+二分 做的蛮顺的,1A 可是大部分时间是在调试代码.由于模板的全局变量用混了,而自 ...
- poj 3261 后缀数组 可重叠的 k 次最长重复子串
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 16430 Accepted: 7252 Ca ...
- Milk Patterns - poj 3261 (求重复k次的最长子串)
题目大意:给你一个数组,求这个数组里面至少重复k次的子串. 分析:后缀数组的练手题目...不过给的数字比较大,可以先离散化处理一下即可. 代码如下: ===================== ...
- Milk Patterns poj3261(后缀数组)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9274 Accepted: 4173 Cas ...
- POJ 3261 (后缀数组 二分) Milk Patterns
这道题和UVa 12206一样,求至少重复出现k次的最长字串. 首先还是二分最长字串的长度len,然后以len为边界对height数组分段,如果有一段包含超过k个后缀则符合要求. #include & ...
- [poj 3261]后缀数组+滑窗最小值
题目链接:http://poj.org/problem?id=3261 这个是可以交叉的重复串,所以用height就可以了,但是题目说让重复k次以上,也就是直接做一个k-1长度的滑窗最小值,从这些最小 ...
- POJ 3261 后缀数组+二分
思路: 论文题- 二分+对后缀分组 这块一开始不用基数排序 会更快的(其实区别不大) //By SiriusRen #include <cstdio> #include <cstri ...
随机推荐
- python学习笔记 | 猜拳游戏
''' @author: 人人都爱小雀斑 @time: 2020/3/6 18:52 @desc: 实验结果心得: 1.难点主要在判断谁输谁赢 2.挺好的 ''' import random d={1 ...
- 【函数分享】每日PHP函数分享(2021-1-19)
substr 函数返回字符串的一部分.注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0. string substr (string $string ...
- HTML&CSS:构建网站不能不说的那些事儿
很高兴你能看到这个专栏!俗话说得好,相逢即是缘分,没准你和我在上一世也曾有过五百次的回眸,才得此一面.说的有点恶心了,咱还是书归正传,说说这个专栏吧. 这个专栏主要讲的是 HTML 和 CSS 的页面 ...
- 安装jdk-windows系统
1. 明确需要安装的jdk版本,注意jdk存在小版本号,例如jdk1.7_51,如果不清楚小版本号的话建议安装最新版本的jdk: 2. 打开cmd命令窗口,输入java -version查看本机是否安 ...
- uni-app开发经验分享五: 解决三端页面兼容问题的方法
在做uni-app开发的过程中,我们最头疼可能不是开发的过程中的逻辑,而是最后要做的三端兼容测试和修改,在我开发的项目中,这一步都是最头疼和令人头秃的过程,这里总结一些个人开发遇到的问题,希望对大家有 ...
- pytorch——不用包模拟简单线性预测,数据类型,创建tensor,索引与切片
常见的学习种类 线性回归,最简单的y=wx+b型的,就像是调节音量大小.逻辑回归,是否问题.分类问题,是猫是狗是猪 最简单的线性回归y=wx+b 目的:给定大量的(x,y)坐标点,通过机器学习来找出最 ...
- python生成器 递归
生成器 生成器:只要函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器 生成器就是迭代器 yield的功能 1.yield为我们提供了一种自定义迭 ...
- 在vSphere中为不同服务器配置IPMI功能
在vSphere HA中如果要配置并启用DPM功能,需要记录服务器远程管理接口的IP地址(不是ESXi的IP地址,而是另一个独立的IP地址,是与ESXi服务器同一网段的另一个IP地址)与MAC地址.远 ...
- Zerotier在windows下实现内网远程桌面
Zerotier实现内网远程桌面 使用背景 实验室设备条件过于恶劣 向日葵在有些场景下会莫名崩溃,或者画面不动. Teamviewer免费版在之前用的时候出现过疑似商业行为被断连,github上寻解决 ...
- Simple decorator that intercepts connection errors and ignores these if settings specify this.
django-redis/cache.py at master · jazzband/django-redis https://github.com/jazzband/django-redis/blo ...