【POJ】3261 Milk Patterns

http://poj.org/problem?id=3261

题意:一个长度为n的串,要求最长的子串的长度且这个子串的出现次数不少于k次。(1<=n<=20000, 2<=k<=n)

#include <cstdio>
#include <algorithm>
using namespace std;

const int N=20015;
void sort(int *x, int *y, int *sa, int n, int m) {
	static int c[N], i;
	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];
}
void hz(int *r, int *sa, int n, int m) {
	static int t1[N], t2[N];
	static int *x, *y, *t, j, i, p=0;
	x=t1; y=t2;
	for(i=0; i<n; ++i) x[i]=r[i], y[i]=i;
	sort(x, y, sa, n, m);
	for(j=1, p=1; p<n; j<<=1, m=p) {
		p=0;
		for(i=n-j; i<n; ++i) y[p++]=i;
		for(i=0; i<n; ++i) if(sa[i]-j>=0) y[p++]=sa[i]-j;
		sort(x, y, sa, n, m);
		for(t=x, x=y, y=t, x[sa[0]]=0, p=1, i=1; i<n; ++i)
			x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+j]==y[sa[i-1]+j]?p-1:p++;
	}
}
void geth(int *a, int *sa, int *rank, int *h, int n) {
	static int k, i, j; k=0;
	for(i=1; i<=n; ++i) rank[sa[i]]=i;
	for(i=1; i<=n; h[rank[i++]]=k)
		for(k?--k:0, j=sa[rank[i]-1]; a[i+k]==a[j+k]; ++k);
}
const int oo=~0u>>2;
int sa[N], rank[N], h[N], n, a[N], b[N], K;
bool check(int k) {
	int cnt=1;
	for(int i=2; i<=n; ++i) {
		if(h[i]>=k) {
			++cnt;
			if(cnt>=K) return 1;
		}
		else cnt=1;
	}
	if(cnt>=K) return 1;
	return 0;
}
int mp[1000005];
int main() {
	scanf("%d%d", &n, &K);
	for(int i=1; i<=n; ++i) scanf("%d", &a[i]), b[i]=a[i];
	sort(b+1, b+1+n);
	int tot=unique(b+1, b+1+n)-b-1;
	for(int i=1; i<=tot; ++i) mp[b[i]]=i;
	for(int i=1; i<=n; ++i) a[i]=mp[a[i]];
	hz(a, sa, n+1, 200);
	geth(a, sa, rank, h, n);
	int mid, l=0, r=n;
	while(l<=r) {
		mid=(l+r)>>1;
		if(check(mid)) l=mid+1;
		else r=mid-1;
	}
	printf("%d\n", l-1);
	return 0;
}

  



经典题...同样是分组height...将高度>=二分值的分在一组,然后判断是否有大于等于K个元素即可

时间: 2024-08-27 17:38:57

【POJ】3261 Milk Patterns的相关文章

POJ 题目3261 Milk Patterns(后缀数组求最长重叠至少k次的子串长度)

Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 12128   Accepted: 5387 Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation,

POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)

Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14094   Accepted: 6244 Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk given by his cows varies from day to day. On further investigation,

【POJ】2278 DNA Sequence

各种wa后,各种TLE.注意若AC非法,则ACT等一定非法.而且尽量少MOD. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 105 8 #define NXTN 4 9 10 char str[15]; 11 12 typedef struct Matrix {

【POJ】1739 Tony&#39;s Tour

http://poj.org/problem?id=1739 题意:n×m的棋盘,'#'是障碍,'.'是空白,求左下角走到右下角且走过所有空白格子的方案数.(n,m<=8) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; #define BIT(a,b) ((a)<<((b)<<1)) #

【POJ】2449 Remmarguts&#39; Date(k短路)

http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k 首先我们建反向边,跑一次从汇到源的最短路,将跑出来的最短路作为估价函数h 根据f=g+h 我们将源s先走,此时实际价值g为0,估价为最短路(他们的和就是s-t的最短路) 将所有s所连的边都做相同的处理,加入到堆中(假设此时到达的点为x,那么x的g等于s到这个点的边权,因为根据最优,g+h此时是从x

【POJ】2318 TOYS ——计算几何+二分

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10281   Accepted: 4924 Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a problem - their child John never puts his toys away w

【POJ】3009 Curling 2.0 ——DFS

Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11432   Accepted: 4831 Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is

【POJ】1056 IMMEDIATE DECODABILITY

字典树水题. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 typedef struct Trie { 6 bool v; 7 Trie *next[2]; 8 } Trie; 9 10 Trie *root; 11 12 bool create(char str[]) { 13 int i = 0, id; 14 bool ret = false; 15 Trie *p = root

【POJ】2418 Hardwood Species

简单字典树. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 #define MAXN 128 6 7 typedef struct Trie { 8 int count; 9 Trie *next[MAXN]; 10 Trie() { 11 count = 0; 12 for (int i=0; i<MAXN; ++i) 13 next[i] = NULL; 14 } 15 }