BZOJ3998 弦論 字尾自動機

2022-05-27 13:51:10 字數 1130 閱讀 4116

題意

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

分析t=0的時候,這個題跟spoj-sublex的做法一樣,當t=1的時候,不同位置的子串算多個,那麼初始化的時候d[u]=cnt[u],沒走乙個字元不是k-1而是k-cnt[u]。

1 #include 2 #include 3 #include 4 #include 5

6using

namespace

std;

7const

int maxn=1e6+5;8

char

s[maxn];

9int

n,t,k;

1011

struct

statest[2*maxn];

15int

last,cur,sz;

16int cnt[2*maxn],d[2*maxn],c[2*maxn];

17void

init()

2425

void build_sam(int

c)34

if(p==-1

)35 st[cur].link=0;36

else

49 st[q].link=st[cur].link=clone;50}

51}52 last=cur;53}

54int cmp(int a,int

b)57

void solve(int k,int

ty)62

int u=0;63

while

(k)78}79

}80}81

void

update()89}

90for(int i=0;i<26;i++)95}

9697

intmain()else

118}

119for(int i=1;i)

120 d[i]=cnt[i];

121update();

122 solve(k,1

);123

}124

return0;

125 }

view code

bzoj3998 弦論 字尾自動機

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

bzoj3998 字尾自動機

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

bzoj 3998 (字尾自動機)

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