bzoj3998 字尾自動機

2021-07-28 04:04:52 字數 1046 閱讀 7468

對於乙個給定長度為n的字串,求它的第k小子串是什麼。

第一行是乙個僅由小寫英文本母構成的字串s

第二行為兩個整數t和k,t為0則表示不同位置的相同子串算作乙個。t=1則表示不同位置的相同子串算作多個。k的意義如題所述。

輸出僅一行,為乙個數字串,為第k小的子串。如果子串數目不足k個,則輸出-1

aabc

0 3aabn≤

5∗105

t<2

k≤109

對輸入的字串建乙個字尾自動機,分類討論r的維護情況.

若t==0,每個相同子串只算一次,所以r陣列每個元素都為1,r[tmp[i]]=1;

若t==1,每個相同子串可算多次,從parent樹上兒子向父親維護,r[fa[tmp[i]]]+=r[tmp[i]];

需要注意的是,兩種情況下的r[root]=0

#include

#define maxn 500010

#define maxt 1000010

//#define debug

using

namespace

std;

int n,sign,k;

int size[maxt],sum[maxt],tmp[maxt];

char ch[maxn];

inline

int read()

return read*sign;

}struct sam

int insert(int x)

void add(int pos)}}

void tsort()

r[root]=0;

for(int i=tot;i;i--)

}void build()

void dfs(int x,int k)

else k-=size[son[x][i]];}}

void work()

else

}} sam ;

int main()

bzoj 3998 (字尾自動機)

給你乙個長度為 n 的字串 str 和乙個數 k 現在有兩個詢問 1.op 0 不同位置的相同子串算作乙個,求字典序第 k 小子串 2.op 1 不同位置的相同子串算作多個,求字典序第 k 小子串 因為字尾自動機能夠包含所有的子串,因此我們考慮在字尾自動機上貪心的跳轉。我們設字尾自動機上第 i 號結...

BZOJ3998 弦論 字尾自動機

題意 給定乙個長度為n的字串,求他的第k小子串是什麼。分析t 0的時候,這個題跟spoj sublex的做法一樣,當t 1的時候,不同位置的子串算多個,那麼初始化的時候d u cnt u 沒走乙個字元不是k 1而是k cnt u 1 include 2 include 3 include 4 inc...

bzoj3998 弦論 字尾自動機

對於乙個給定長度為n的字串,求它的第k小子串是什麼。第一行是乙個僅由小寫英文本母構成的字串s 第二行為兩個整數t和k,t為0則表示不同位置的相同子串算作乙個。t 1則表示不同位置的相同子串算作多個。k的意義如題所述。輸出僅一行,為乙個數字串,為第k小的子串。如果子串數目不足k個,則輸出 1 aabc...