乙隻只會字尾自動機卻不會字尾陣列的弱雞做了一下hdu - 1403,結果sam被卡記憶體了,然後學習了一下sa。
以下兩道題都是求lcs,區別在於字串長度。
hdu - 1403
1 #include 2 #include 3 #includeview code4 #include 5
#define rank rank
6using
namespace
std;
7const
int maxn = 2e5+10;8
char
str[maxn];
9int
sa[maxn], rank[maxn], height[maxn], sum[maxn], tp[maxn];
10//
rank[i] 第i個字尾的排名, sa[i] 排名為i的字尾的位置, height[i] 排名為i的字尾與排名為(i-1)的字尾的lcp
11//
sum[i] 基數排序輔助陣列, 儲存小於i的元素有多少個, tp[i] rank的輔助陣列(按第二關鍵字排序的結果),與sa意義一樣
12bool cmp(int *f, int x, int y, int w)
1314
void get_sa(char *s, int n, int
m)15
39int k = 0
;40 n--;
41for(int i = 0; i <= n; i++) rank[sa[i]] =i;
42for(int i = 0; i < n; i++)
4349}50
intmain()
5166 printf("
%d\n
", sol);67}
68return0;
69 }
spoj - lcs
sa版本:
1 #include 2 #include 3 #includeview code4 #include 5
#define rank rank
6using
namespace
std;
7const
int maxn = 5e5+10;8
char
str[maxn];
9int
sa[maxn], rank[maxn], height[maxn], sum[maxn], tp[maxn];
10//
rank[i] 第i個字尾的排名, sa[i] 排名為i的字尾的位置, height[i] 排名為i的字尾與排名為(i-1)的字尾的lcp
11//
sum[i] 基數排序輔助陣列, 儲存小於i的元素有多少個, tp[i] rank的輔助陣列(按第二關鍵字排序的結果),與sa意義一樣
12bool cmp(int *f, int x, int y, int w)
1314
void get_sa(char *s, int n, int
m)15
39int k = 0
;40 n--;
41for(int i = 0; i <= n; i++) rank[sa[i]] =i;
42for(int i = 0; i < n; i++)
4349}50
intmain()
5166 printf("
%d\n
", sol);67}
68return0;
69 }
sam版本:
1 #include2view codeusing
namespace
std;
3const
int kind=26;4
const
int maxn=250000;5
struct
state615
};16
intsz;
17 state st[maxn*2+5
];18 inline state* newnode(int len = 0)19
25 state *root,*last;
26void extend(int
w)27
35if
(p)3652}
53}54else cur->link=root;
55 last=cur;56}
57string
keyword;
58int
main()
5979
else
8091
else
92 tmp=0;93
}94 ans=max(ans,tmp);95}
96 cout
98return0;
99 }
SA 字尾陣列 學習筆記
今天沒事幹,學了sa 其實是模擬賽掛了 引用資料 2009年國家集訓隊 洛谷 273期 我們記 sa i 為排名為 i 的字尾的開始位置。rk i 為開始位置為 i 的字尾的排名。我們採用基數排序,因為這樣在排序第一關鍵字的時候,第二關鍵字順序相對正確。舉例子就是21和12排序,因為你的程式不知道什...
SA 字尾陣列
首先一定要確定sa 是個什麼東西 sa i 表示的是排名為 i 的字尾是哪乙個 至於字尾 i的排名是多少,那個是ra nk i 當然啦 最最最難懂的就是基數排序 要是不用基數排序,每次對於乙個二元組直接so rt一下 這樣的複雜度是o nlog 2 對於二元組的基數排序應該是這樣做的 首先把所有元素...
字尾陣列SA
給定乙個字串s,按字典序排序s的所有子串 鬼知道什麼思想,好像沒有什麼思想。哦,想起來了,是倍增。考慮最簡單的字尾間o n o n 比較和快排o nlog n o n logn 總複雜度o n2lo gn o n 2log n 考慮優化字串間的比較,用倍增的思想,假設k 2 k 2 長度的已經比完了...