POJ 1509 字尾陣列

2022-04-07 11:40:28 字數 969 閱讀 2032

點選開啟鏈結

題意:給個串問最小的字尾,但是這個串是個環

思路:是個環也好處理,那麼就將串複製一遍加到後面就行了,然後求出字尾陣列和高度陣列,剛開始我寫的是就求出字尾陣列sa,然後從排名第1開始找,比如找到了i,排名為i的從第sa[i]開始,那麼如果這個值小於輸入串的長度,直接輸出就行,提交wa,看了看討論,有這樣的陣列,aaaa那麼應該輸出1,而那個程式輸出4,然後想到用高度陣列,剛開始找到4的位置,然後找下乙個排名的高度陣列,如果lcp的值大於串的長度,那麼更新結果,以此類推直到lcp的值不再大於原串的長度,而為什麼大於原串長度就可以繼續呢,打個比方,abab,變成abababab,sa陣列為4 8 3 7 2 6 1 5,lcp陣列為0 2 4 6 0 1 3 5 ,然後我們找到的第乙個pos為3,然後它的下乙個就是pos為1的位置,如果lcp[3]的值大於原串長度4,就說明從1開始的串,可以代替從3開始的串,因為最終的長度肯定為4嘛,在說的具體一點,看的時候拿紙畫一下,從3開始的串代表的是3 4 1 2 ,體現在複製一遍的串上就是3 4 5 6 ,而從1開始的是1 2 3 4,所以如果lcp[3]大於4,代表3 4 5 6與1 2 3 4是相同的串,懂了嗎~~~~

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int maxn=20010;

char str[maxn];

int rank1[maxn],tmp[maxn],sa[maxn],lcp[maxn];

int n,k;

bool compare_sa(int i,int j)

break;}}

printf("%d\n",pos+1);

}return 0;

}

字尾自動機poj1509

今天終於知道什麼是字尾自動機了,知道他長啥樣了,知道他的幾個性質了,但是構造的過程還沒太明白,對於用節點維護某些東西肯定還不行,先敲一道水題,算整理一下模板 poj1509有最小表示法的演算法,這裡中字尾自動機求解。思路 把串重複一邊加到後面,然後構造字尾自動機,然後從根遍歷字串長度,得到位置 in...

poj1509(字尾自動機)

其實這個題也可以用最小表示法 但是還是練了練字尾自動機 明白了建構函式就是構造原串 整個串 的以最後乙個字元為止的所有字尾都加上乙個字元產生新串的字尾 這個題目就是找這個字串迴圈中的最小表示 直接兩個原串一拼接 所有的迴圈都是拼接後長串的字尾 找到長度為len的最小字尾即可 include incl...

POJ 1509 最小表示法 字尾自動機

題意 給你乙個字串的環,求從那個位置起字串的字典序最小。題解 最小表示法。鏈結 view code 1 include 2 include 3 include 4 include 5 include 6 7 define n 202008 求最小迴圈同構串起點 9using namespace st...