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 ...