poj3261 Milk Patterns【后缀数组】【二分】
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
Sample Input
- 8 2
- 1
- 2
- 3
- 2
- 3
- 2
- 3
- 1
Sample Output
- 4
题意:
找一个最长的子串,他在原字符串中出现的次数至少k次。允许重叠。
思路:
二分枚举答案。对某一段i~j,如果height[i~j]都超过了mid,说明可以有一个长度为mid的串在这些后缀中都有出现过。也就是说这个串出现了j - i次,统计这个次数,如果超过k,st = mid + 1
感觉应该hash也能做?没写过。【嗯不行不行,仔细想了一下hash好像要n方】
- #include <iostream>
- #include <set>
- #include <cmath>
- #include <stdio.h>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <map>
- using namespace std;
- typedef long long LL;
- #define inf 0x7f7f7f7f
- const int maxn = 1e6 + ;
- int n, k;
- char str[maxn];
- int sa[maxn];
- int t1[maxn], t2[maxn], c[maxn];
- LL rnk[maxn], height[maxn];
- int cnt[maxn];
- void build_sa(int s[], int n, int m)
- {
- int i, j, p, *x = t1, *y = t2;
- for(i = ; i < m; i++)c[i] = ;
- for(i = ; i < n; i++)c[x[i] = s[i]]++;
- for(i = ; i < m; i++)c[i] += c[i - ];
- for(i = n - ; i >= ; i--)sa[--c[x[i]]] = i;
- for(j = ; j <= n; j <<= ){
- p = ;
- for(i = n - j; i < n; i++)y[p++] = i;
- for(i = ; i < n; i++)if(sa[i] >= j)y[p++] = sa[i] - j;
- for(i = ; i < m; i++)c[i] = ;
- for(i = ; i < n; i++)c[x[y[i]]]++;
- for(i = ; i < m; i++)c[i] += c[i - ];
- for(i = n - ; i >= ; i--)sa[--c[x[y[i]]]] = y[i];
- swap(x, y);
- p = ;
- x[sa[]] = ;
- for(i = ; i < n; i++)
- x[sa[i]] = y[sa[i - ]] == y[sa[i]] && y[sa[i - ] + j] == y[sa[i] + j] ? p - :p++;
- if(p >= n)break;
- m = p;
- }
- }
- void get_height(int s[], int n)
- {
- int i, j, k = ;
- //cout<<"SA:"<<endl;
- for(i = ; i <= n; i++){
- //cout<<sa[i]<<endl;
- rnk[sa[i]] = i;
- }
- for(i = ; i < n; i++){
- if(k) k--;
- j = sa[rnk[i] - ];
- while(s[i + k] == s[j + k])k++;
- height[rnk[i]] = k;
- }
- }
- bool check(int t)
- {
- int num = ;
- for(int i = ; i <= n; i++){
- if(height[i] >= t){
- num++;
- if(num >= k)return true;
- }
- else num = ;
- }
- return false;
- }
- int s[maxn];
- int main()
- {
- while(scanf("%d%d", &n, &k) != EOF){
- //scanf("%s", str);
- int m = -inf;
- for(int i = ; i < n; i++){
- scanf("%d", &s[i]);
- m = max(m, s[i]);
- cnt[i] = ;
- }
- s[n] = cnt[n] = ;
- build_sa(s, n + , m + );
- //cout<<1<<endl;
- get_height(s, n);
- //cout<<2<<endl;
- int st = , ed = n, ans;
- while(st <= ed){
- int mid = (st + ed) / ;
- if(check(mid)){
- st = mid + ;
- ans = mid;
- }
- else{
- ed = mid - ;
- }
- }
- printf("%d\n", ans);
- }
- return ;
- }
poj3261 Milk Patterns【后缀数组】【二分】的更多相关文章
- POJ-3261 Milk Patterns,后缀数组+二分。。
Milk Patterns 题意:求可重叠的至少重复出现k次的最长的字串长. 这题的做法和上一题 ...
- Poj 3261 Milk Patterns(后缀数组+二分答案)
Milk Patterns Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk g ...
- POJ3261 Milk Patterns —— 后缀数组 出现k次且可重叠的最长子串
题目链接:https://vjudge.net/problem/POJ-3261 Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Tot ...
- BZOJ 1717 [USACO06DEC] Milk Patterns (后缀数组+二分)
题目大意:求可重叠的相同子串数量至少是K的子串最长长度 洛谷传送门 依然是后缀数组+二分,先用后缀数组处理出height 每次二分出一个长度x,然后去验证,在排序的后缀串集合里,有没有连续数量多于K个 ...
- poj3261 Milk Patterns 后缀数组求可重叠的k次最长重复子串
题目链接:http://poj.org/problem?id=3261 思路: 后缀数组的很好的一道入门题目 先利用模板求出sa数组和height数组 然后二分答案(即对于可能出现的重复长度进行二分) ...
- poj 3261 Milk Patterns 后缀数组 + 二分
题目链接 题目描述 给定一个字符串,求至少出现 \(k\) 次的最长重复子串,这 \(k\) 个子串可以重叠. 思路 二分 子串长度,据其将 \(h\) 数组 分组,判断是否存在一组其大小 \(\ge ...
- [USACO06FEC]Milk Patterns --- 后缀数组
[USACO06FEC]Milk Patterns 题目描述: Farmer John has noticed that the quality of milk given by his cows v ...
- POJ3261 Milks patterns(后缀数组)
Farmer John has noticed that the quality of milk given by his cows varies from day to day. On furthe ...
- 【poj 3261】Milk Patterns 后缀数组
Milk Patterns 题意 给出n个数字,以及一个k,求至少出现k次的最长子序列的长度 思路 和poj 1743思路差不多,二分长度,把后缀分成若干组,每组任意后缀公共前缀都>=当前二分的 ...
- POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次
Milk Patterns Description Farmer John has noticed that the quality of milk given by his cows varie ...
随机推荐
- Python_selenium二次封装selenium的几个方法
Python_selenium二次封装selenium的几个方法 将常用的几个webdriver方法封装到自己写的一个类中去,此实例中是将"浏览器后退.浏览器前进.打开站点和关闭浏览器&qu ...
- DBA操作
sqlplus sys/tiger as sysdba; alter user scott account unlock; 用户已更改 切换用户:conn scott/tiger as sysdba ...
- windows自启动脚本
直接写一个普通批处理文件,如果是需要让它在系统启动时运行, 就将它放在C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup目录下, 如果是需要 ...
- HttpClient(三)-- 抓取图片
使用HttpClient抓取图片,先通过 entity.getContent() 获取输入流,然后 使用 common io 中的文件复制 方法 将图片专区到本地,代码如下: 1.需要依赖common ...
- ssh面密码登录配置-hadoop安装准备
1. 用ssh-keygen创建公钥,一直回车即可 root@kali:~# ssh-keygen -t rsa Generating public/private rsa key pair. Ent ...
- Django 数据传递
在前面的访问数据库中,我们是这样来插入数据的: [root@localhost web]$ cat web/urls.py urlpatterns = patterns('', .... url(r' ...
- WF的初步学习与创建
一直在好奇WF的学习,嘿嘿,今天就不用啦,我之后就要接触WF的项目,刚开始在百度上寻找WF新建一个项目的过程,发现很少这样的实例让我学习操作,我想给我一个大的项目我也不可能一下就知道应该怎样去操作,由 ...
- windows下nodejs与coffeeScript环境搭建
[本文档摘抄自网上资料] 安装NodeJS和CoffeeScript方法 首先安装Node(因为nodeJs是服务器端javascript运行环境),到http://nodejs.org/下载对应格式 ...
- 编写java的时候出现“编码GBK的不可映射字符”
今天在编写文件的时候,使用 javac ***.java 但是java文件里面会出现一些中文的信息,So:会报错 方法: 加参数-encoding UTF-8 例如:javac -encodig UT ...
- css案例 - 评分效果的星星✨外衣
纳尼?什么星星外衣?好,直接上图比较能说清楚: 仔细看会发现规律:可以根据百分比/分值动态改变高亮星星的个数. 分步骤图: 这种效果,如果遇到一分一个星,没有半星(或者有也可以,直接加一个半星的类名) ...