字尾陣列 模板 HDU 1403 HDU 6194

2021-09-22 12:21:25 字數 902 閱讀 1071

hdu 1403

題意: 給出兩個字串, 求他們的最長公共子串。

思路: 兩個字串的最長公共子串長度顯然就是兩個字串的所有字尾中的最長公共字首長度。

ac code:

#include#define mem(a,b) memset((a),b,sizeof(a))

typedef long long ll;

const int n=200010;

using namespace std;

char s[200010];

int sa[n],t1[n],t2[n],c[n],rank[n],height[n];

//rank[i] 第i個字尾的排名, sa[i] 排名為i的字尾的位置,height[i]為sa[i]和sa[i-1]的最長公共字首(lcp)長度

void build_sa(int n,int m)

}void getheight(int n)

printf("%d\n",ans);

}return 0;

}

hdu 6194

題意:給你乙個字串和k,求這個字串中有多少不同的子串恰好出現了k 次。

網上找的部落格,再結合自己的部落格,瞎改一番,過了。

#includeusing namespace std;

#define n 500000

int rank[n],sa[n],height[n],f[n][50];

int t1[n],t2[n],c[n];

char s[n];

void build_sa(int n,int m)

}void getheight(int n)

cout<}

}

hdu1403 字尾陣列模板

題意 給出兩個字串,求他們的最長公共子串 思路 兩個字串的最長公共子串長度顯然就是兩個字串的所有字尾中的最長公共字首長度.可以先用乙個沒有出現的字元 便於後面區分字尾是否屬於相同字串 將兩個字串連成乙個字串,再用字尾陣列求其height,sa陣列,對於當前 i,通過 sa 陣列區分字尾 i 和 i ...

HDU1403 字尾陣列,模板,入門)

解題思路 字尾陣列的寫法一開始看有些匪夷所思,花了我半天時間才解析完,理解內涵。關於height,詳見我的另一篇字尾陣列分組中的部落格。也推薦幾篇 解析 原理講解 原理講解 題意 給出兩個字串,求他們的最長公共子串 字尾陣列建立字尾優先順序的複雜度為o nlogn n為字串的長度。用height求解...

HDU 1403 字尾陣列初步

題意 求兩個串的最長公共子串 兩個串連線起來然後求高度陣列 注意兩個sa值必須分別在不同一側 本題是用來測試模板的,回想起青島那次翻車感覺很糟糕 include include include include include include include include include inclu...