題意:
對於乙個給定的長度為n的字串,求出它的第k小子串。
有引數t,t為0則表示不同位置的相同子串算作乙個,t為1則表示不同位置的相同子串算作多個。
題解:首先,因為t的原因,字尾陣列較難實現,這裡不討論。
使用字尾自動機:
因為,這裡需要按字典序考慮子串,所以要使用trs指標。
首先,計算出每個子串的貢獻:t=0則為1,t=1則為出現次數。
然後,通過記搜算出匹配到每個點之後可以形成多少貢獻。因為使用trs,無需考慮壓縮。
最後,在每個節點處找到唯一乙個應當向下計算的點,迴圈直到找到解。
**:
#include #define ll long long
int trs[1000010][26],fa[1000010],len[1000010],sl=1,la=1;
int su[1000010];ll dp[1000010];
void insert(int c)
if(p==0)
fa[np]=1;
else
}} su[la]=1;
}int fr[1000010],ne[1000010],v[1000010],bs=0;
void addb(int a,int b)
void build()
void dfs0(int u)
}void dfs1(int u)
}void dfs2(int u) }}
char zf[500010];
int main()
int i;
for(i=0;i<26;i++)
printf("%c",i+'a');
u=trs[u][i];
} return 0;
}
P3975 TJOI2015 弦論 第K小子串
為了提高智商,zjy開始學習弦論。這一天,她在 string theory 中看到了這樣一道問題 對於乙個給定的長度為n的字串,求出它的第k小子串是什麼。你能幫幫她嗎?第一行是乙個僅由小寫英文本母構成的字串s 第二行為兩個整數t和k,t為0則表示不同位置的相同子串算作乙個,t為1則表示不同位置的相同...
TJOI2015 弦論 字尾自動機求第k小串
對於乙個給定長度為 n 的字串,求它的第 k 小子串,若 t 為 0 表示不同位置的相同子串算作乙個,否則算作多個,子串數目不足 k 個,則輸出 1 n le 5 cdot 10 5 建sam,按拓撲序動態規劃求出每個結點後有多少個子串,然後貪心求解即可。include define rep i,x...
省選專練之後綴自動機 TJOI2015 弦論
這個看似模板,但是我還是沒有理解透徹,畢竟寫得慢還是主要比不過抄碼的人。但是在zjy鉅子本色出演的題目,我還是請教了zjy本人,我大抵是會了。這個本身有兩種情況 1 t 0求right集合 又叫endpos集合 2 t 1求siz集合 這個都好求 然後就是乙個類似於可持久化線段樹的查詢方式了 從小到...