bzoj3998 弦論 字尾自動機

2022-08-05 05:39:15 字數 638 閱讀 5349

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

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

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

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

aabc

0 3aab

n<=5*10^5

t<2

k<=10^9

我們預處理sam上每個點按照拓撲序往後走一共幾個串即可。

如果t=0,那麼每個點初始權值都是1,否則按照拓撲序列舉點,然後把乙個點的權值給他的pre節點累加。

之後在sam上跑26分即可。

#include #define ll long long

using namespace std;

int t,n,k;char ch[500005];

struct sam

void ins(int c)}}

void pre()

void dfs(int x,int k)

k-=s[a[x][i]];}}

}sam;

int main()

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...

bzoj 3998 (字尾自動機)

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