題意
給定乙個長度為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 5view code6using
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 }
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 號結...