UOJ #35. 后缀排序(后缀数组模板题)
来源:互联网 发布:淘宝客服一般几点下班 编辑:程序博客网 时间:2024/05/29 17:39
测试一下模板
#include<bits/stdc++.h>#include<string>using namespace std;const int maxn =2e5+10;struct Suffix{ int r[maxn]; int sa[maxn],rank[maxn],height[maxn]; int t[maxn],t2[maxn],c[maxn],n,m; void init(string s) { n=s.size(); for(int i=0;i<n;i++) r[i]=(int)s[i]; m=128;// } int cmp(int *r,int a,int b,int l) {return r[a]==r[b]&&r[a+l]==r[b+l];} void build() { int i,k,p,*x=t,*y=t2; r[n++]=0; for (i=0; i<m; i++) c[i]=0; for (i=0; i<n; i++) c[x[i]=r[i]]++; for (i=1; i<m; i++) c[i]+=c[i-1]; for (i=n-1; i>=0; i--) sa[--c[x[i]]]=i; for (k=1,p=1; k<n; k*=2,m=p) { for (p=0,i=n-k; i<n; i++) y[p++]=i; for (i=0; i<n; i++) if (sa[i]>=k) y[p++]=sa[i]-k; for (i=0; i<m; i++) c[i]=0; for (i=0; i<n; i++) c[x[y[i]]]++; for (i=1; i<m; i++) c[i]+=c[i-1]; for (i=n-1; i>=0; i--) sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for (i=1; i<n; i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],k)?p-1:p++; } n--; } void LCP() { int i,j,k=0; for (i=1; i<=n; i++) rank[sa[i]]=i; for (i=0; i<n; i++) { if (k) k--; j=sa[rank[i]-1]; while (r[i+k]==r[j+k]) k++; height[rank[i]-1]=k; } } int LCS(string s1,string s2) { int len=s1.size(); s1=s1+"$"+s2; init(s1); build(); LCP(); int ans=0; for(int i=2;i<=n;i++) if((sa[i-1]<len)!=(sa[i]<len)) ans=max(ans,height[i]); return ans; }};Suffix SA;string str;int main(){ cin>>str; int len=str.size(); SA.init(str); SA.build(); for(int i=1;i<=len;i++) cout<< SA.sa[i]+1<<(i==len?'\n':' '); SA.LCP(); for(int i=1;i<len;i++) cout<< SA.height[i]<<(i==len-1?'\n':' '); return 0;}
0 0
- UOJ #35. 后缀排序(后缀数组模板题)
- UOJ #35. 后缀排序 后缀数组模板题
- UOJ #35. BZOJ 1031 后缀排序 后缀数组模板
- uoj#35. 后缀排序 后缀数组
- Uoj #35. 后缀排序(后缀数组)
- Uoj#35. 后缀排序
- uoj #35. 后缀排序
- 【UOJ 35】 后缀排序|后缀数组
- 【UOJ 35】 后缀排序|后缀数组 *2
- 【UOJ 35】 后缀排序|后缀数组 *3
- UOJ #35 后缀排序(后缀数组)
- [省选前题目整理][UOJ 35]后缀排序(后缀数组)
- uoj#35: 后缀排序
- 【uoj #35】后缀排序
- 【uoj 35】后缀排序
- uoj P35 后缀排序
- 后缀数组(模板题)
- Tyvj_P1860 后缀数组(后缀数组模板题)
- Android Studio遇到的问题
- nhibernate的关系
- Queue Reconstruction by Height
- codevs 3290 noip 2013 Day2 T3华容道
- ajax异步刷新上传文件
- UOJ #35. 后缀排序(后缀数组模板题)
- c++初学之面向对象
- 453. Minimum Moves to Equal Array Elements
- 《APUE》笔记-第九章-进程关系
- curl工具与常见命令
- CodeForces 405A Gravity Flip【水题】
- 【Android - V】之ViewPager的使用
- js event对象整理及详细介绍
- 第十周练习-2 判断回文数