【bzoj】1717 [Usaco2006 Dec]Milk Patterns 产奶的模式
2024-09-04 12:38:39
【算法】后缀数组
【题解】后缀数组
由于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 ;
}
最新文章
- 安卓手机APP压力monkey测试
- 3n+1b 备忘录方法
- 【数据结构与算法分析——C语言描述】第二章总结 算法分析
- 很不错的NGINX URL重写实例
- QTableWidget 导出到表格
- Unity3d 项目管理
- (六)backbone - API学习 - Backbone路由
- 回想一下著名的BigTable论题
- 捋一捋js面向对象的继承问题
- SIM7600C读写本机号码
- 20164319 刘蕴哲 Exp5 MSF基础应用
- UVA817-According to Bartjens(DFS)
- 梯度下降算法对比(批量下降/随机下降/mini-batch)
- Ionic app 上传图片之webApi接口
- Jmeter干货 不常用却极其有用的几个地方
- [CF1025F]Disjoint Triangles[极角排序+组合计数]
- Top 10 Best Free Netflow Analyzers and Collectors for Windows
- Javascript全栈技术架构
- CUDA显卡运算编程菜鸟入门指南1——Hello world - yfszzx的专栏 - 博客频道 - CSDN.NET
- senlenium使用