字尾陣列專題 loading

2021-07-28 09:29:02 字數 2317 閱讀 2661

sa倍增演算法
學習資料**
後 綴 數 組

—-處理字串的有力工具 處理字串的有力工

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define mod 1000000007

#define fir first

#define sec second

#define fin freopen("/home/ostreambaba/文件/input.txt", "r", stdin)

#define fout freopen("/home/ostreambaba/文件/output.txt", "w", stdout)

#define mes(x, m) memset(x, m, sizeof(x))

#define pii pair

#define pll pair

#define inf 1e9+7

#define inf 0x3f3f3f3f

#define pi 4.0*atan(1.0)

#define lowbit(x) (x&(-x))

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define max(a,b) a>b?a:b

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

double eps = 1e-9;

const

int maxn = 1e6;

const

int maxm = 1e6+10;

using

namespace

std;

inline

int read()

while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();

return x*f;

}int wa[maxn];

int wb[maxn];

int wn[maxn];

int wm[maxn];

int rk[maxn];

int height[maxn];

int cmp(int *r,int a,int b,int l)

void da(int *r,int *sa,int n,int m)

}計數排序o(n),m過大可用快排

for(i=0;ifor(i=0;i0;

for(i=0;ifor(i=1;i1];

for(i=n-1;i>=0;i--) sa[--wn[wm[i]]]=y[i];

for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i1],sa[i],j)?p-1:p++;

}}void getheight(int *r,int *sa,int n)

for(i=0;ifor(k?k--:0,j=sa[rk[i]-1];r[i+k]==r[j+k];k++);

}}//主要為了方便後面求height的操作。避免這句中rank[i]-1出現為負數的情況

int main()

r[str.size()]=0;

int sa[maxn];

da(r,sa,n+1,m);

for(int i=0;iprintf("%d ",sa[i]);

}cout

}cout

}cout

//height 陣列:定義height[i]=suffix(sa[i-1])和suffix(sa[i])的最長公共字首,也就是排名相鄰的兩個字尾的最長公共字首的長度 。

///*sa[1~~n]為有效值 sa[i]=a則代表排在第i位的是第a個字尾。 a屬於[0~n-1]

rank[0~n-1]是有效值 rank[i]=b則代表第i個字尾排在第b位 b屬於[1~n]

height[2~n]是有效值 height[i]=c則代表排在第i位的字尾和排在第i-1的字尾的最長字首長度是c */

字尾陣列專題

對字尾陣列比較好的理解 spoj694 題意很短,直接看 這種這種方法求不同子串行的個數非常好。不過自己沒有想出來。主要原因還是對字尾陣列的 sa,h,rank陣列的真正運用也許不夠。這道題用到乙個結論。如果兩個放在越相鄰的位置那麼他們的公共字首越多。他們越相似。證明,比如比如 如果在字尾陣列裡面 ...

SA 字尾陣列 專題總結

曾經一度以為sa是大神知識點來著 後來才發現其實是澤州哥哥講得太深奧了我等蒟蒻不能參透 理解了之後題還是可以做的 因為大多數都不是在sa上做文章而是與其他知識點結合 迪哥講 sa 和 sam 鈦聚啦 放例題算是sa的板子題了吧 求出每個點能控制的區間,單調棧 二分都行,直接統計就行了 sa乙個套路就...

kuangbin帶你飛 專題十八 字尾陣列

寫了好久才把字尾陣列的專題寫完 字尾陣列就是對字串的所有字尾來搞事,通過對這些字尾排序,來得到這些字尾之前存在的關係。字尾陣列中的sa陣列 排名陣列 和height 相鄰排名lcp 有很多很有用的特性,使得在處理一些字串問題的時候很給力,比較流行的求字尾陣列的演算法有o nlogn 的倍增求法和o ...