對於乙個給定長度為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 號結...