博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
准备学习后缀数组 先存一个论文里的模板
阅读量:7227 次
发布时间:2019-06-29

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

#include 
#include
#include
#include
#include
using namespace std;#define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb))#define G(x) ((x) < tb ? (x) * 3 + 1 :((x) - tb) * 3 + 2)const int MAXN = 300010;const int MAXM = 100010;char input[MAXM];int wa[MAXN],wb[MAXN],ws[MAXN],wv[MAXN],wsd[MAXN],r[MAXN],sa[MAXN];int num[MAXN];char str[MAXN];int dp[MAXM][25];int c0(int *r,int a,int b){ return r[a] == r[b] && r[a + 1] == r[b + 1] && r[a + 2] == r[b + 2];}int c12(int k,int *r,int a,int b){ if(k == 2) return r[a] < r[b] || r[a] == r[b] && c12(1,r,a + 1,b + 1); else return r[a] < r[b] || r[a] == r[b] && wv[a + 1]< wv[b + 1];}void mysort(int *r,int *a,int *b,int n,int m){ int i; for(i = 0 ; i < n ; i++) wv[i] = r[a[i]]; for(i = 0 ; i < m ; i++) wsd[i] = 0; for(i = 0 ; i < n ; i++) wsd[wv[i]]++; for(i = 1 ; i < m ; i++) wsd[i] += wsd[i - 1]; for(i = n - 1 ; i >= 0 ; i--) b[--wsd[wv[i]]] = a[i];}void dc3(int *r,int *sa,int n,int m){ int i,j,*rn = r + n ,*san = sa + n,ta = 0,tb = (n + 1) / 3,tbc = 0,p; r[n] = r[n + 1] = 0; for(i = 0 ; i < n ; i++) if(i % 3 != 0) wa[tbc++] = i; mysort(r + 2,wa,wb,tbc,m); mysort(r + 1,wb,wa,tbc,m); mysort(r,wa,wb,tbc,m); for(p = 1,rn[F(wb[0])] = 0,i = 1 ; i < tbc ; i++) rn[F(wb[i])] = c0(r,wb[i - 1],wb[i])?p - 1 : p++; if(p < tbc) dc3(rn,san,tbc,p); else for(i = 0 ; i < tbc ; i++) san[rn[i]] = i; for(i = 0 ; i < tbc ; i++) if(san[i] < tb) wb[ta++] = san[i] * 3; if(n % 3 == 1) wb[ta++] = n - 1; mysort(r,wb,wa,ta,m); for(i = 0 ; i < tbc ; i++) wv[wb[i] = G(san[i])] = i; for(i = 0,j = 0,p = 0 ; i < ta && j < tbc ; p++) sa[p]=c12(wb[j] % 3,r,wa[i],wb[j]) ? wa[i++] : wb[j++]; for(; i < ta ; p++) sa[p] = wa[i++]; for(; j < tbc ; p++) sa[p] = wb[j++];}int cmp(int *r,int a,int b,int l){ return r[a ]== r[b] && r[a + l] == r[b + l];}void da(int *r,int *sa,int n,int m){ int i,j,p,*x = wa,*y = wb,*t; for(i = 0 ; i < m ; i++) wsd[i] = 0; for(i = 0 ; i < n ; i++) wsd[x[i] = r[i]]++; for(i = 1 ; i < m ; i++) wsd[i] += wsd[i - 1]; for(i = n - 1 ; i >= 0 ; i--) sa[--wsd[x[i]]] = i; for(j = 1 , p = 1 ; p < n ; j *= 2,m = p) { for(p = 0 ,i = n - j ; i < n ; i++) y[p++] = i; for(i = 0 ; i < n ; i++) if(sa[i] >= j) y[p++] = sa[i] - j; for(i = 0 ; i < n ; i++) wv[i] = x[y[i]]; for(i = 0 ; i < m ; i++) wsd[i] = 0; for(i = 0 ; i < n ; i++) wsd[wv[i]]++; for(i = 1 ; i < m ; i++) wsd[i] += wsd[i - 1]; for(i = n - 1 ; i >= 0 ; i--) sa[--wsd[wv[i]]] = y[i]; for(t = x,x = y,y = t,p = 1,x[sa[0]] = 0,i = 1; i < n ; i++) x[sa[i]] = cmp(y,sa[i - 1],sa[i],j) ? p - 1 : p++; }}int Rank[MAXN],height[MAXN];void calheight(int *r,int *sa,int n){ int i,j,k = 0; for(i = 1 ; i <= n ; i++) Rank[sa[i]] = i; for(i = 0 ; i < n ; height[Rank[i++]] = k) for(k ? k--:0,j = sa[Rank[i] - 1] ; r[i + k]==r[j + k]; k++);}void RMQ_init(int n,int b[]){ int i,j; for(i = 1 ; i <= n ; i++) dp[i][0] = b[i]; for(j = 1 ; (1 << j) <= n ; j++) for(i = 1 ; i + (1 << j) - 1 <= n ; i++) dp[i][j] = min(dp[i][j - 1],dp[i + (1<<(j - 1))][j - 1]);}int rmq(int s,int v){ s = Rank[s],v = Rank[v]; if(s > v)swap(s,v); s++; int k=(int)(log((v - s + 1)*1.0)/log(2.0)); return min(dp[s][k],dp[v - (1 << k) + 1][k]);}int main(){ while (scanf ("%s",input)!=EOF) { int len=strlen(input); for (int i=0;i

 

转载于:https://www.cnblogs.com/nj-czy/p/5732890.html

你可能感兴趣的文章
一 flask介绍 三
查看>>
C++拓展笔记1-3:浅析C++关键字const的几个作用
查看>>
Django 分页组件替换自定义分页
查看>>
Pdf Convert Image 的解决方案
查看>>
[笔记]使用clearfix清除浮动
查看>>
数据强转
查看>>
Latest crack software ftp download
查看>>
OpenStack 的防火墙规则流程
查看>>
Overloading Django Form Fields
查看>>
03.MyBatis的核心配置文件SqlMapConfig.xml
查看>>
python学习笔记(9)-python编程风格
查看>>
Apache HTTP Server搭建虚拟主机
查看>>
(译).NET4.X 并行任务中Task.Start()的FAQ
查看>>
git log显示
查看>>
java中相同名字不同返回类型的方法
查看>>
Rails NameError uninitialized constant class solution
查看>>
Android 获取SDCard中某个目录下图片
查看>>
设置cookies第二天0点过期
查看>>
【转载】NIO客户端序列图
查看>>
poj_2709 贪心算法
查看>>