博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 2251: [2010Beijing Wc]外星联络【SA】
阅读量:5269 次
发布时间:2019-06-14

本文共 1691 字,大约阅读时间需要 5 分钟。

先求SA,然后按字典序从小到大枚举子串,每到一个后缀从长到短枚举子串(跳过长为he[i]的和前一段重复的子串),然后维护一个点p,保证i~p之间最小的he>=当前枚举长度,p是单调向右移的

然后把每个后缀的结果倒着输出即可

#include
#include
#include
using namespace std;const int N=3005;int n,m,wa[N],wb[N],wv[N],wsu[N],sa[N],rk[N],he[N],a[N],tot;char s[N];bool cmp(int r[],int a,int b,int l){ return r[a]==r[b]&&r[a+l]==r[b+l];}void saa(char r[],int n,int m){ int *x=wa,*y=wb; for(int i=0;i<=m;i++) wsu[i]=0; for(int i=1;i<=n;i++) wsu[x[i]=r[i]]++; for(int i=2;i<=m;i++) wsu[i]+=wsu[i-1]; for(int i=n;i>=1;i--) sa[wsu[x[i]]--]=i; for(int j=1,p=1;j<=n&&p
<<=1,m=p) { p=0; for(int i=n-j+1;i<=n;i++) y[++p]=i; for(int i=1;i<=n;i++) if(sa[i]>j) y[++p]=sa[i]-j; for(int i=1;i<=n;i++) wv[i]=x[y[i]]; for(int i=0;i<=m;i++) wsu[i]=0; for(int i=1;i<=n;i++) wsu[wv[i]]++; for(int i=2;i<=m;i++) wsu[i]+=wsu[i-1]; for(int i=n;i>=1;i--) sa[wsu[wv[i]]--]=y[i]; swap(x,y); p=1; x[sa[1]]=1; for(int i=2;i<=n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p:++p; } for(int i=1;i<=n;i++) rk[sa[i]]=i; for(int i=1,j,k=0;i<=n;he[rk[i++]]=k) for(k?k--:0,j=sa[rk[i]-1];r[i+k]==r[j+k];k++);}int main(){ scanf("%d%s",&n,s+1); saa(s,n,200); // for(int i=1;i<=n;i++) // cerr<
<<" "<
<
=he[i]+1;j--) { while(p
=j) p++; a[++tot]=p-i+1; } for(int j=tot;j>=1;j--) if(a[j]>1) printf("%d\n",a[j]); } return 0;}

转载于:https://www.cnblogs.com/lokiii/p/10438606.html

你可能感兴趣的文章
mysql-5.7 innodb 的并行任务调度详解
查看>>
shell脚本
查看>>
Upload Image to .NET Core 2.1 API
查看>>
Js时间处理
查看>>
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。...
查看>>
Linux中防火墙centos
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
【SVM】libsvm-python
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
Leetcode Balanced Binary Tree
查看>>
go:channel(未完)
查看>>
[JS]递归对象或数组
查看>>
多线程《三》进程与线程的区别
查看>>
linux sed命令
查看>>
html标签的嵌套规则
查看>>
[Source] Machine Learning Gathering/Surveys
查看>>