后缀数组模板
2015-12-15 16:04
274 查看
//Copyright(c)2015 liuchenrui #include<cstdio> #include<ctime> #include<iostream> #include<algorithm> #include<cstring> using namespace std; inline void splay(int &v){ v=0;char c=0;int p=1; while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();} while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();} v*=p; } char s[300010]; int sa[2][300010],rank[2][300010]; int v[300010],n; int h[300010]; int p=0,q=1; void calcsa(int k,int *sa,int *rank,int *Sa,int *Rank){ for(int i=1;i<=n;i++)v[rank[sa[i]]]=i; for(int i=n;i>=1;i--){ if(sa[i]-k>0){ Sa[v[rank[sa[i]-k]]--]=sa[i]-k; } } for(int i=n-k+1;i<=n;i++){ Sa[v[rank[i]]--]=i; } for(int i=1;i<=n;i++){ Rank[Sa[i]]=Rank[Sa[i-1]]+(rank[Sa[i-1]]!=rank[Sa[i]] || rank[Sa[i-1]+k]!=rank[Sa[i]+k]); } } void geth(){ for(int k=0,i=1;i<=n;i++){ if(rank[p][i]==1)h[rank[p][i]]=0; else{ int j=sa[p][rank[p][i]-1]; while(s[i+k]==s[j+k])k++; h[rank[p][i]]=k;if(k)k--; } } } int main(){ freopen("xxx.in","r",stdin); freopen("xxx.out","w",stdout); scanf("%s",s+1);n=strlen(s+1); int k=1; for(int i=1;i<=n;i++)v[s[i]]++; for(int i=1;i<=256;i++)v[i]+=v[i-1]; for(int i=1;i<=n;i++)sa[p][v[s[i]]--]=i; for(int i=1;i<=n;i++) rank[p][sa[p][i]]=rank[p][sa[p][i-1]]+(s[sa[p][i-1]]!=s[sa[p][i]]); while(k<n){ calcsa(k,sa[p],rank[p],sa[q],rank[q]); q^=1,p^=1,k<<=1; } geth(); for(int i=1;i<=n;i++){ printf("%d ",sa[p][i]); } printf("\n"); for(int i=1;i<=n;i++){ printf("%d ",h[i]); } }
照着黄学长的写了一遍,然后狂默写了8遍
应该能够牢记了
相关文章推荐
- inno setup检查是否已经安装
- MyBatis学习七:spring和MyBatis整合、逆向工程
- javascript:理解ownerDocument
- (小笔记)从下面出现的半块activity的方法
- Android图片加载缓存库<1>
- Android 沉浸式状态栏攻略 让你的状态栏变色吧
- servlet输出流图片
- 【ArcGis for javascript从零开始】之二 ArcGIS for JavaScript安装本地API
- Coverage
- 自定义dialog
- Weak Alias
- 让Storm插上CEP的翅膀 - Siddhi调研和集成
- 1、webservice的简单使用
- django+nginx+uwsgi 部署配置
- OpenLayers2.13.1知识整理
- 格雷码 Python编写
- phpcms 调用多级栏目和多级栏目下的文章列表
- Spring jdbcTemplat插入,查询
- Rstudio一个工程多个文件
- 重定向和转发有什么区别!getRequestDispatcher,sendRedirect为代表(1)