题目链接:http://poj.org/problem?id=3261

这个是可以交叉的重复串,所以用height就可以了,但是题目说让重复k次以上,也就是直接做一个k-1长度的滑窗最小值,从这些最小值里取最大即可。

这里其实为了节省空间可以先给数字离散化一下,这样就只有20000了,不过不离散化空间也够用。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std; const int maxn=; #define F(x) ((x)/3+((x)%3==1?0:tb))
#define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2)
int wa[maxn*],wb[maxn*],wv[maxn*],wss[maxn*];
int c0(int *r,int a,int b)
{
return r[a]==r[b] && r[a+]==r[b+] && r[a+]==r[b+];
}
int c12(int k,int *r,int a,int b)
{
if (k==) return r[a]<r[b] || (r[a]==r[b]&&c12(,r,a+,b+));
else return r[a]<r[b] || (r[a]==r[b]&&wv[a+]<wv[b+]);
}
void sort(int *r,int *a,int *b,int n,int m)
{
int i;
for (i=;i<n;i++) wv[i]=r[a[i]];
for (i=;i<m;i++) wss[i]=;
for (i=;i<n;i++) wss[wv[i]]++;
for (i=;i<m;i++) wss[i]+=wss[i-];
for (i=n-;i>=;i--) b[--wss[wv[i]]]=a[i];
}
void dc3(int *r,int *sa,int n,int m)
{
int i,j,*rn=r+n;
int *san=sa+n,ta=,tb=(n+)/,tbc=,p;
r[n]=r[n+]=;
for (i=;i<n;i++) if (i%!=) wa[tbc++]=i;
sort(r+,wa,wb,tbc,m);
sort(r+,wb,wa,tbc,m);
sort(r,wa,wb,tbc,m);
for (p=,rn[F(wb[])]=,i=;i<tbc;i++)
rn[F(wb[i])]=c0(r,wb[i-],wb[i])?p-:p++;
if (p<tbc) dc3(rn,san,tbc,p);
else for (i=;i<tbc;i++) san[rn[i]]=i;
for (i=;i<tbc;i++) if (san[i]<tb) wb[ta++]=san[i]*;
if (n%==) wb[ta++]=n-;
sort(r,wb,wa,ta,m);
for (i=;i<tbc;i++) wv[wb[i]=G(san[i])]=i;
for (i=,j=,p=;i<ta&&j<tbc;p++)
sa[p]=c12(wb[j]%,r,wa[i],wb[j])?wa[i++]:wb[j++];
for (;i<ta;p++) sa[p]=wa[i++];
for (;j<tbc;p++) sa[p]=wb[j++];
}
void da(int str[],int sa[],int rank[],int height[],int n,int m)
{
for (int i=n;i<n*;i++)
str[i]=;
dc3(str,sa,n+,m);
int i,j,k=;
for (i=;i<=n;i++) rank[sa[i]]=i;
for (i=;i<n;i++)
{
if (k) k--;
j=sa[rank[i]-];
while (str[i+k]==str[j+k]) k++;
height[rank[i]]=k;
}
}
int a[maxn*];
int ra[maxn*],height[maxn*],sa[maxn*]; deque< pair<int,int> > q; int solve(int n,int k)
{
// height[2..n]
// length k-1 min
int ma=;
while (!q.empty()) q.pop_back();
for (int i=;i<k-;i++)
{
pair<int,int> p=make_pair(height[i+],i);
while (!q.empty()&&q.back()>p) q.pop_back();
q.push_back(p);
}
for (int i=k-;i<=n-;i++)
{
while (!q.empty() && q.front().second<i-(k-)) q.pop_front();
pair<int,int> p=make_pair(height[i+],i);
while (!q.empty()&&q.back()>p) q.pop_back();
q.push_back(p);
ma=max(ma,q.front().first);
}
return ma;
} int main()
{
int n,k;
while (~scanf("%d%d",&n,&k))
{
for (int i=;i<n;i++) scanf("%d",&a[i]),a[i]++;
da(a,sa,ra,height,n,);
printf("%d\n",solve(n,k));
}
return ;
}

[poj 3261]后缀数组+滑窗最小值的更多相关文章

  1. POJ 3261 后缀数组

    题目链接:http://poj.org/problem?id=3261 题意:约翰注意到奶牛产奶的之类是不断变化的,虽然他不能预测从当天到下一天的变化情况但是他知道变化是有规律的,牛奶的质量由一个整数 ...

  2. poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)

    题目:http://poj.org/problem?id=3261 仍然是后缀数组的典型应用----后缀数组+lcp+二分 做的蛮顺的,1A 可是大部分时间是在调试代码.由于模板的全局变量用混了,而自 ...

  3. Milk Patterns POJ - 3261 后缀数组

    Farmer John has noticed that the quality of milk given by his cows varies from day to day. On furthe ...

  4. POJ 3261 (后缀数组 二分) Milk Patterns

    这道题和UVa 12206一样,求至少重复出现k次的最长字串. 首先还是二分最长字串的长度len,然后以len为边界对height数组分段,如果有一段包含超过k个后缀则符合要求. #include & ...

  5. poj 3261 后缀数组 可重叠的 k 次最长重复子串

    Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 16430   Accepted: 7252 Ca ...

  6. POJ 3261 后缀数组+二分

    思路: 论文题- 二分+对后缀分组 这块一开始不用基数排序 会更快的(其实区别不大) //By SiriusRen #include <cstdio> #include <cstri ...

  7. POJ - 3261 后缀数组 height应用

    题意:求最少重叠\(k\)次的重复子串的最大长度 子串长度问题依然是二分枚举,可以观察出重叠的一定是sa排序中连续的 之前想出一种判断要\(n^2\)的方法,没有考虑到后面肯定会连续出现的情况 (大概 ...

  8. poj 3693 后缀数组 重复次数最多的连续重复子串

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8669   Acc ...

  9. POJ 1743-POJ - 3261~后缀数组关于最长字串问题

    POJ 1743 题意: 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1~~88范围内的整数,现在要找一个重复的主题.“主题”是整个音符序列的一个子串,它需 ...

随机推荐

  1. python入门(续)

    类和方法 创建类 class A(object): def add(self, a,b ): return a+b count = A() print(count.add(3,5)) 初始化工作 cl ...

  2. is和==,编码补充

    一,is和==的区别: 1, 通过一个ID()可以查看到一个变量表示的值在内存中的地址.    s = 'alex' print(id(s)) # 4326667072 s = "alex& ...

  3. Python学习:1.快速搭建python环境

    一.安装python 现在python有两个比较大的版本一个是python3.x一个是python2.x,python3.x相当于与python2.x是一个比较大的升级,但是python3.x没有向下 ...

  4. 【ajax】ajax异步实现用户注册验证

    从前台到后台实现简单用户注册检查用户是否存在 1.编写domain public class User { private String username; private String passwo ...

  5. JSOI2018 R1 & 九省联考2018 滚粗记

    在NOIP与PKUWC相继滚粗后,rp守恒定律似乎终于开始起作用了…… (尽管Day2依然滚粗?) Day1: 本着前40min不写代码的准则,先把三道题大致过了一遍,似乎都比较喜闻乐见? T1:对抗 ...

  6. 如何在Moodle中显示PPT课件

    Moodle中目前是不直接支持PPT的,所以需要曲线救国: 1.安装 iSpring Free 8版本,免费版,其实是一个PPT的插件,在PPT的工具栏中有显示. 2.打开PPT后,直接在该工具中进行 ...

  7. 初步学习pg_control文件之三

    接前文,初步学习pg_control文件之二 继续学习: 研究 DBState,先研究 DB_IN_PRODUCTION ,看它如何出现: 它出现在启动Postmaster时运行的函数处: /* * ...

  8. c++ class as sort function

    // constructing sets #include <iostream> #include <set> #include <string.h> bool f ...

  9. EntityFramewrok 使用

    1.使用一些查询比较复杂或者需要拼接的查询的时候最好一直保持IQueryable.一直到最后取数据的时候才进行查询.例如分页之类的条件拼接. var query = dbset.Where(expre ...

  10. webpack使用时可能出现的问题

    1.在配置完webpack.config.js准备进行热加载开发时,修改React内容浏览器不会自动局部刷新,而且会console出一些提示: The following modules couldn ...