【算法】后缀数组

【题解】后缀数组

由于m太大,先离散化。

然后处理SA和LCP。

最后用单调队列处理即可。

注意实际上队列头尾长度限制是K-1.

删队尾不要删过头

i≥K才能开始统计答案。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
int n,m,s[maxn],x[maxn],y[maxn],base[maxn],sa[maxn],h[maxn],K,q[maxn];
struct lshs{int ord,num;}lsh[maxn];
bool cmp(lshs a,lshs b)
{return a.num<b.num;}
void build_sa(int m)
{
for(int i=;i<=m;i++)base[i]=;
for(int i=;i<=n;i++)base[x[i]=s[i]]++;
for(int i=;i<=m;i++)base[i]+=base[i-];
for(int i=n;i>=;i--)sa[base[x[i]]--]=i;
for(int k=;k<=n;k<<=)
{
int p=;
for(int i=n-k+;i<=n;i++)y[++p]=i;
for(int i=;i<=n;i++)if(sa[i]>k)y[++p]=sa[i]-k;
for(int i=;i<=m;i++)base[i]=;
for(int i=;i<=n;i++)base[x[i]]++;
for(int i=;i<=m;i++)base[i]+=base[i-];
for(int i=n;i>=;i--)sa[base[x[y[i]]]--]=y[i];
swap(x,y);
p=;x[sa[]]=;
for(int i=;i<=n;i++)
x[sa[i]]=y[sa[i]]==y[sa[i-]]&&y[sa[i]+k]==y[sa[i-]+k]?p:++p;
if(p>=n)break;
m=p;
}
int k=;
for(int i=;i<=n;i++)
{
if(k)k--;
int j=sa[x[i]-];
while(s[i+k]==s[j+k])k++;
h[x[i]]=k;
}
}
int main()
{
scanf("%d%d",&n,&K);
for(int i=;i<=n;i++)
{
scanf("%d",&lsh[i].num);
lsh[i].ord=i;
}
sort(lsh+,lsh+n+,cmp);
int p=;s[lsh[].ord]=;
for(int i=;i<=n;i++)s[lsh[i].ord]=lsh[i].num==lsh[i-].num?p:++p;
build_sa(p);
K--;
int head=,tail=;
int ans=;
for(int i=;i<=n;i++)
{
while(h[q[tail-]]>h[i]&&tail>head)tail--;
q[tail++]=i;
if(i-q[head]>=K)head++;
if(i>=K+)ans=max(ans,h[q[head]]);
}
printf("%d",ans);
return ;
}

【bzoj】1717 [Usaco2006 Dec]Milk Patterns 产奶的模式的更多相关文章

  1. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1017  Solved: ...

  2. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )

    二分答案m, 后缀数组求出height数组后分组来判断. ------------------------------------------------------------ #include&l ...

  3. BZOJ#1717:[Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组+单调队列)

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的 ...

  4. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

    Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". ...

  5. 【刷题】BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式

    Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". ...

  6. BZOJ 1717 [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)

    [题目链接]http://www.lydsy.com/JudgeOnline/problem.php?id=1717 [题目大意] 求一个最长的串,使得其在母串中出现的次数达到要求 [题解] 二分答案 ...

  7. bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式【后缀自动机】

    就是后缀自动机的板子嘛..构造完自动机之后拓扑一下,记录size,对于size大于k的点和ans取max #include<iostream> #include<cstdio> ...

  8. 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1469  Solved: ...

  9. bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

    后缀数组+二分答案+离散化.(上次写的时候看数据小没离散化然后一直WA...写了lsj师兄的写法. #include<cstdio> #include<cstring> #in ...

随机推荐

  1. TCP系列31—窗口管理&流控—5、TCP流控与滑窗

    一.TCP流控 之前我们介绍过TCP是基于窗口的流量控制,在TCP的发送端会维持一个发送窗口,我们假设发送窗口的大小为N比特,网络环回时延为RTT,那么在网络状况良好没有发生拥塞的情况下,发送端每个R ...

  2. ubuntu 16.04 安装jdk9错误

    转自:https://askubuntu.com/questions/769467/can-not-install-openjdk-9-jdk-because-it-tries-to-overwrit ...

  3. JAVA的泛型与反射的联合应用

    通过泛型与反射的结合,可以编写框架来使开发更容易,这里演示的是BaseDao部分的简单使用. BaseDao部分代码: public abstract class BaseDao<T>{ ...

  4. hdu 1688 Sightseeing (最短路径)

    Sightseeing Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. Python正则表达式re模块

    re.compile(pattern,flags=0)将正则表达式编译成正则表达式对象.可以使用match()和search()方法进行匹配.对于常用的表达式可以先进行编译,后续可多次使用以提高效率. ...

  6. hadoop 使用map合并小文件到SequenceFile

    上一例是直接用SequenceFile的createWriter来实现,本例采用mapreduce的方式. 1.把小文件整体读入需要自定义InputFormat格式,自定义InputFormat格式需 ...

  7. [NOIP2016 TG D2T3]愤怒的小鸟

    题目大意:有一架弹弓位于(0,0)处,每次可以用它向第一象限发射一只小鸟,飞行轨迹均为形如y=ax2+bxy=ax+bx2 y=ax2+bx的曲线,且必须满足a<0(即是下开口的) 平面的第一象 ...

  8. BZOJ4946 & 洛谷3826 & UOJ318:[NOI2017]蔬菜——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4946 https://www.luogu.org/problemnew/show/P3826 ht ...

  9. HDU3652:B-number——题解

    http://acm.hdu.edu.cn/showproblem.php?pid=3652 题目大意:给一个数n,求1-n所有满足下列条件的数的个数: 1.包含一个子串为“13” 2.能被13整除. ...

  10. [LOJ 6159] 最长树链

    看到要求gcd不为1所以肯定在这条答案链上都是一个质数的倍数,所以就会产生一个很暴力的想法 没错,正解就是这样的暴力 只让走是i(素数)倍数的点,作最长链 最长链可以树形dp或两遍bfs,一遍找端点, ...