Milk Patterns - poj 3261 (求重复k次的最长子串)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; const int MAXN = 2e4+; struct SuffixArr
{
int tempx[MAXN], tempy[MAXN], text[MAXN], Hash[MAXN];
int rank[MAXN], sa[MAXN], sum[MAXN], height[MAXN];
int *x, *y, N, MaxId; void GetText(int data[], int len)
{
N = len, x=tempx, y=tempy; for(int i=; i<N; i++)
Hash[i] = data[i]; sort(Hash, Hash+N);
MaxId = unique(Hash, Hash+N) - Hash; for(int i=; i<N; i++)
{
text[i] = x[i] = lower_bound(Hash, Hash+MaxId, data[i])-Hash;
y[i] = i;
}
}
bool cmp(int i, int len)
{
if(sa[i]+len > N || sa[i-]+len > N)
return false;
if(y[sa[i]]!=y[sa[i-]] || y[sa[i]+len]!=y[sa[i-]+len])
return false; return true;
}
void BaseSort()
{
for(int i=; i<MaxId; i++)
sum[i] = ;
for(int i=; i<N; i++)
sum[ x[ y[i] ] ] += ;
for(int i=; i<MaxId; i++)
sum[i] += sum[i-];
for(int i=N-; i>=; i--)
sa[ --sum[ x[ y[i] ] ] ] = y[i];
}
void GetSa()
{
BaseSort(); for(int len=; len <= N; len<<=)
{
int id = ; for(int i=N-len; i<N; i++)
y[id++] = i;
for(int i=; i<N; i++)if(sa[i] >= len)
y[id++] = sa[i] - len; BaseSort();
swap(x, y);
x[ sa[] ] = id = ; for(int i=; i<N; i++)
{
if(cmp(i, len) == true)
x[sa[i]] = id;
else
x[sa[i]] = ++id;
} MaxId = id+; if(MaxId >= N)
break;
}
}
void GetHeight()
{
for(int i=; i<N; i++)
rank[sa[i]] = i; /// debug(text);
/// debug(rank); for(int k=, i=; i<N; i++)
{
if(!rank[i])
{
height[] = k = ;
continue;
}
if(k)k--; int pre = sa[ rank[i]- ]; while(text[i+k] == text[pre+k])
k++;
height[rank[i]] = k;
} ///debug(height);
}
void debug(int p[])
{
for(int i=; i<N; i++)
printf("%d ", p[i]);
printf("\n");
}
}; SuffixArr suf;
int data[MAXN]; bool Find(int times, int k)
{
int cnt=; for(int i=; i<suf.N; i++)
{
if(suf.height[i] < k)
cnt = ;
else
{
cnt += ;
if(cnt == times-)
return true;
}
} return false;
} int main()
{
int N, times; while(scanf("%d%d", &N, ×) != EOF)
{
for(int i=; i<N; i++)
scanf("%d", &data[i]);
data[N] = -; suf.GetText(data, N+);
suf.GetSa();
suf.GetHeight(); int L=, R=N, ans=; while(L <= R)
{
int Mid = (L+R)>>; if(Find(times, Mid) == true)
{
ans = Mid;
L = Mid + ;
}
else
R = Mid - ;
} printf("%d\n", ans);
} return ;
}
Milk Patterns - poj 3261 (求重复k次的最长子串)的更多相关文章
- poj3261 后缀数组求重复k次可重叠的子串的最长长度
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13669 Accepted: 6041 Ca ...
- poj 3261 Milk Patterns(后缀数组)(k次的最长重复子串)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7938 Accepted: 3598 Cas ...
- Milk Patterns POJ - 3261(后缀数组+二分)
题意: 求可重叠的最长重复子串,但有一个限制条件..要至少重复k次 解析: 二分枚举k,对于连续的height 如果height[i] >= k 说明它们至少有k个元素是重复的,所以判断一下就好 ...
- Milk Patterns POJ - 3261 后缀数组
Farmer John has noticed that the quality of milk given by his cows varies from day to day. On furthe ...
- POJ 3261 可重叠k次最长重复子串
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13127 Accepted: 5842 Ca ...
- POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次
Milk Patterns Description Farmer John has noticed that the quality of milk given by his cows varie ...
- POJ 3261 Milk Patterns 可重复k次的最长重复子串
Milk PatternsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=3261 Description ...
- poj3261 Milk Patterns 后缀数组求可重叠的k次最长重复子串
题目链接:http://poj.org/problem?id=3261 思路: 后缀数组的很好的一道入门题目 先利用模板求出sa数组和height数组 然后二分答案(即对于可能出现的重复长度进行二分) ...
- poj 3261 求可重叠的k次最长重复子串
题意:求可重叠的k次最长重复子串的长度 链接:点我 和poj1743差不多 #include<cstdio> #include<iostream> #include<al ...
随机推荐
- IOS 在IOS6中设置navigationBar背景图片 会有一条 黑色阴影 --- 解决方案
//给navigationBar设置背景图片 if ([self.navigationController.navigationBar respondsToSelector:@selector(set ...
- 从零开始 WIN8.1 下Android 开发环境搭建
一.JDK安装 当前最新版本是JDK8.0 地址http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21331 ...
- java中关于static的小知识
static能够修饰属性和方法.凡是static修饰的方法和属性都是和类的关系较大,都在加载的时候要特殊处理(包括属性和类的优先加载).下面比较下static修饰属性和方法时的区别: 一.修饰属性的时 ...
- P次方数 英雄会 csdn 高校俱乐部
题目: 一个整数N,|N| >= 2, 如果存在整数x,使得N = x * x * x... (p个x相乘) =x^p,则称N是p次方数,给定32位内的整数N,求最大的P.例如N=5,输出1,N ...
- [转]操作xml,将xml数据显示到treeview的C#代码
XmlDocument xml = new XmlDocument(); private void Form1_Load(object sender, EventArgs e) { CreateXML ...
- php模拟POST请求提交数据
php模拟POST请求提交数据 1.基于fsockopen function phppost00($jsonString){ $URL='https://www.jy.com/phppostok.ph ...
- Jquery获取元素坐标
获取页面某一元素的绝对X,Y坐标,相对于浏览器窗体,可以用offset()方法: var X = $('#DivID').offset().top; var Y = $('#DivID').offse ...
- Apache 支持.htaccess
******************************************************************************* Apache 服务器 ********* ...
- EFBaseDal
public class BaseDal<T> where T : class, new() { DataModelContainer db = new DataMod ...
- Java IO学习总结
Java IO流学习总结 Io流的内容比较多 ,大致可以分为字节流和字符流,其中为了提高效率又用到了缓冲区. Java流操作有关的类或接口: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合, ...