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