//1403
思路:字串的任何乙個子串都是這個字串的某個字尾的字首,則求a和b的最長公共子串等價於求a的字尾和b的字尾的最長公共字首的最大值。
做法:將第二個字串寫在第乙個字串後面,中間用乙個沒有出現過的字元隔開,再求這個新的字串的字尾陣列。
1 #include "bits/stdc++.h"2
using
namespace
std;
3const
int maxn = 1e6 + 10;4
char
str[maxn];
5int
int_str[maxn];
6int
len;
7int
str_rank[maxn], s_r[maxn], rank_str[maxn], a[maxn], b[maxn], h_rank[maxn];89
intcount[maxn];
10void radix(int *str, int *s_r, int *str_rank, int len, int
m)1121}
2223
void suffix_array(int *str, int *str_rank, int len, int
m)24
33int
j;34
for(i = 0; (1
<< i) < len; ++i)
40radix(b, str_rank, s_r, len, len);
41radix(a, s_r, str_rank, len, len);
42 rank_str[str_rank[0]] = 0;43
for(j = 1; j < len; ++j) 46}
47}4849
void cal_h(int *str, int *str_rank, int *h_rank, int
len)
5055
for(i = 0; i < len; ++i)
61 h_rank[rank_str[i]] =k;62}
63}6465
66int
main()
6783
84int res = 0;85
for(i = 1; i < len; ++i)
89 printf("
%d\n
", res);90}
9192 }
HDU1403 字尾陣列,模板,入門)
解題思路 字尾陣列的寫法一開始看有些匪夷所思,花了我半天時間才解析完,理解內涵。關於height,詳見我的另一篇字尾陣列分組中的部落格。也推薦幾篇 解析 原理講解 原理講解 題意 給出兩個字串,求他們的最長公共子串 字尾陣列建立字尾優先順序的複雜度為o nlogn n為字串的長度。用height求解...
hdu1403 字尾陣列模板
題意 給出兩個字串,求他們的最長公共子串 思路 兩個字串的最長公共子串長度顯然就是兩個字串的所有字尾中的最長公共字首長度.可以先用乙個沒有出現的字元 便於後面區分字尾是否屬於相同字串 將兩個字串連成乙個字串,再用字尾陣列求其height,sa陣列,對於當前 i,通過 sa 陣列區分字尾 i 和 i ...
HDU 1403 字尾陣列初步
題意 求兩個串的最長公共子串 兩個串連線起來然後求高度陣列 注意兩個sa值必須分別在不同一側 本題是用來測試模板的,回想起青島那次翻車感覺很糟糕 include include include include include include include include include inclu...