【算法】后缀数组

【题解】后缀数组

由于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 ;
}

最新文章

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

热门文章

  1. Alpha冲刺——第二天
  2. LintCode-366.斐波纳契数
  3. LintCode-211.字符串置换
  4. MVC中验证码的实现(经常用,记录备用)
  5. Python的time,datetime,string相互转换
  6. js 控制
  7. linux后台运行之screen和nohup
  8. 发送缓冲区sk_wmem_queued
  9. DELPHI BOOKMARK使用
  10. Redis架构演变与redis-cluster群集读写方案