當(dāng)前位置:
首頁 >
Luogu P3975 [TJOI2015]弦论
發(fā)布時(shí)間:2023/12/19
34
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Luogu P3975 [TJOI2015]弦论
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接 \(Click\) \(Here\)
題目大意:
重復(fù)子串不算的第\(k\)大子串
重復(fù)子串計(jì)入的第\(k\)大子串
寫法:后綴自動(dòng)機(jī)。
和\(OI\) \(Wiki\)上介紹的寫法不太一樣,因?yàn)橐瑫r(shí)解決兩個(gè)問題。
把字符串每個(gè)前綴所在等價(jià)類的\(siz\)記為\(1\),然后在\(parent\) \(tree\)上跑一次統(tǒng)計(jì),就可以求出來每一個(gè)等價(jià)類在串中出現(xiàn)的次數(shù)。這里采用類似后綴排序的方法,對(duì)字符串按\(len\)為關(guān)鍵字進(jìn)行排序。至于經(jīng)過每個(gè)點(diǎn)的路徑數(shù)\(sum\),可以在\(Trie\)邊上對(duì)后面節(jié)點(diǎn)的\(sum\)(=每一個(gè)等價(jià)類在串中出現(xiàn)次數(shù))求和得到(初始值等于\(siz\),因?yàn)槊總€(gè)點(diǎn)還有不選的情況)。
不要忘了把\(siz[1]\)和\(sum[1]\)清空!
#include <bits/stdc++.h> using namespace std;const int N = 1100010;char s[N]; int las = 1, node = 1; int fa[N], len[N], siz[N], ch[N][26];void extend (int c) {register int p, q, x, y;p = las, q = ++node; las = q;len[q] = len[p] + 1; siz[q] = 1;while (p != 0 && ch[p][c] == 0) {ch[p][c] = q;p = fa[p];}if (p == 0) {fa[q] = 1;} else {x = ch[p][c];if (len[x] == len[p] + 1) {fa[q] = x;} else {y = ++node;fa[y] = fa[x];fa[x] = fa[q] = y;len[y] = len[p] + 1;memcpy (ch[y], ch[x], sizeof (ch[x]));while (p != 0 && ch[p][c] == x) {ch[p][c] = y;p = fa[p];}}} }int t, k, nd[N], bin[N]; long long sum[N];void output (int u) {if (k <= siz[u]) return;k -= siz[u];register int i;for (i = 0; i < 26; ++i) {if (ch[u][i]) {if (k > sum[ch[u][i]]) {k -= sum[ch[u][i]];} else {printf ("%c", i + 'a');output (ch[u][i]);return;}}} }int main () {scanf ("%s %d %d", s, &t, &k);register int i, j, n;n = strlen (s);for (i = 0; i < n; ++i) extend (s[i] - 'a');for (i = 1; i <= node; ++i) bin[len[i]]++;for (i = 1; i <= node; ++i) bin[i] += bin[i - 1];for (i = 1; i <= node; ++i) nd[bin[len[i]]--] = i;for (i = node; i >= 1; --i) siz[fa[nd[i]]] += siz[nd[i]];for (i = 1; i <= node; ++i) t == 0 ? (sum[i] = siz[i] = 1) : (sum[i] = siz[i]);siz[1] = sum[1] = 0;for (i = node; i >= 1; --i) {for (j = 0; j < 26; ++j) {if (ch[nd[i]][j]) {sum[nd[i]] += sum[ch[nd[i]][j]];}}}if (sum[1] < k) {puts ("-1");} else {output (1);} }\(p.s\)關(guān)于后綴數(shù)組求第一問的方法:
枚舉每一個(gè)后綴,第i個(gè)后綴對(duì)答案的貢獻(xiàn)為\(len?sa[i]+1?height[i]\)。
轉(zhuǎn)載于:https://www.cnblogs.com/maomao9173/p/10452644.html
總結(jié)
以上是生活随笔為你收集整理的Luogu P3975 [TJOI2015]弦论的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20220216-MISC-BUUCTF
- 下一篇: 信息收集之子域名查询--子域名扫描器: