POJ 3261 后缀数组分组二分
来源:互联网 发布:js 限制ip 编辑:程序博客网 时间:2024/04/20 10:53
Description
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 overN (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 leastK times.
Input
Lines 2..N+1: N integers, one per line, the quality of the milk on dayi appears on theith line.
Output
Sample Input
8 212323231
Sample Output
4
题意:求至少重复k次的最长子串,子串之间可以重叠。
解题思路:后缀数组的简单应用,求出sa,rank,height,然后二分长度分组,判断可行性。
代码:
/* ***********************************************Author :xianxingwuguanCreated Time :2014-1-27 17:41:59File Name :1.cpp************************************************ */#pragma comment(linker, "/STACK:102400000,102400000")#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;const int maxn=222222;int height[maxn],rank[maxn],sa[maxn],c[1000100],t1[maxn],t2[maxn],str[maxn];void da(int *str,int n,int m){ int i,j,k,p,*x=t1,*y=t2; for(i=0;i<m;i++)c[i]=0; for(i=0;i<n;i++)c[x[i]=str[i]]++; for(i=1;i<m;i++)c[i]+=c[i-1]; for(i=n-1;i>=0;i--)sa[--c[x[i]]]=i; for(k=1;k<=n;k<<=1) { p=0; for(i=n-k;i<n;i++)y[p++]=i; for(i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k; for(i=0;i<m;i++)c[i]=0; for(i=0;i<n;i++)c[x[y[i]]]++; for(i=1;i<m;i++)c[i]+=c[i-1]; for(i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for(i=1;i<n;i++) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++; if(p>=n)break;\ m=p; }}void calheight(int *str,int n){ int i,j,k=0; for(i=0;i<=n;i++)rank[sa[i]]=i; for(i=0;i<n;i++) { if(k)k--; j=sa[rank[i]-1]; while(str[i+k]==str[j+k])k++; height[rank[i]]=k; }}bool judge(int *sa,int n,int m,int k){ int s=1; for(int i=1;i<=n;i++) { if(height[i]>=m) { s++; if(s>=k)return 1; } else s=1; } return 0;}int main(){ //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int n,i,j,k,m; while(~scanf("%d%d",&n,&k)) { for(i=0;i<n;i++)scanf("%d",&str[i]); str[n]=0; da(str,n+1,1000100); calheight(str,n); int l=1,r=n; while(l<r) { m=(l+r+1)>>1; if(judge(sa,n,m,k))l=m; else r=m-1; } printf("%d\n",l); } return 0;}
- POJ 3261 后缀数组分组二分
- POJ 1743 后缀数组+分组二分
- POJ 3261 后缀数组+二分
- POJ 3261 二分+后缀数组
- POJ 3261 后缀数组+二分
- POJ 3261 Milk Patterns 后缀数组+二分
- poj 3261 Milk Patterns 后缀数组 二分
- 【poj 3261】Milk Patterns 二分+后缀数组
- poj 3261 Milk Patterns 后缀数组+二分
- POJ-3261 Milk Patterns,后缀数组+二分。。
- POJ 3261 Milk Patterns <后缀数组+二分>
- poj 3261 Milk Patterns(后缀数组,二分)
- |poj 3261|后缀数组|二分|Milk Patterns
- poj 3261 (后缀数组+二分)
- poj 3261 Milk Patterns (后缀数组+二分)
- POJ 3261 Milk Patterns 后缀数组+二分
- poj 3789 Milk Patterns(后缀数组+二分答案+height数组分组)
- poj 1743 Musical Theme(后缀数组+二分答案+height数组分组)
- the usages of sublime text
- Broadcom芯片53262的SDK移植
- 动态规划--数字三角形
- 数据库的伸缩性
- 外部调用validate(Object object, Errors errors)
- POJ 3261 后缀数组分组二分
- ArcGis安装介绍
- hbase 第一篇
- Python标准模块logging
- MySQL嵌入式版本的小程序例子
- 客户端POST发送json数据给服务端,客户端端接收服务器端json数据响应
- Android中资源文件assets和res下面raw文件的使用不同点
- wsgiref 源代码分析
- 架构方法实践 - 客户端CAD工具范例 (二 概念架构部分)