洛谷P5329 SNOI2019 字串

2022-05-23 21:18:08 字數 700 閱讀 3586

題目大意:給乙個長度為$n$的字串$s$,字串$p_i$為字串$s$去掉第$i$個字元後形成的字串。請給所有字串$p_i$排序(相同字串按編號排序)

題解:先去掉所有連續相同字元,因為它們形成的字串一定相同(也就是說只按編號排序)。然後發現對於兩個字串$p_i,p_j(i卡點:

c++ code:

#include #include #include #define maxn 1000010

int n, m;

int pos[maxn], len[maxn], nxt[maxn];

char s[maxn], p[maxn];

int main()

int l, r; l = r = m;

for (int i = m - 1; i; --i)

if (p[i] > p[i + 1]) nxt[i] = l, l = i;

else nxt[r] = i, r = i;

for (int i = l; i; i = nxt[i])

for (int j = 0; j < len[i]; ++j) std::cout << pos[i] + j << ' ';

return 0;

}

洛谷 P5329 SNOI2019 字串

暴力是過不了的,雜湊也不行。只能找規律。我們可以發現計刪除原串第i的字元後的新串為pi,則任意pi與pi 1 i include include include include using namespace std const int maxn 1000010 int a maxn int sum...

洛谷P5329 SNOI2019 字串

好像 dfs o n 暴力可以毫無壓力的輕鬆過,當然你要寫 text 也沒人攔你。如果兩個字元相同我們可以發現是一樣的,於是用乙個 a 陣列把這個東西壓起來。如果 s i s 那麼就刪除 s i 如果 s i s 那麼就刪除 s 然後一次 dfs 就解決了。include const int max...

題解 P5329 SNOI2019 字串

用棧的做法來水一發。首先我們有乙個暴力的做法,列舉每個被刪除的字元,然後排序輸出,時間複雜度 o n times n times logn 然後我們觀察一下資料,發現有乙個資料點且任意兩個相鄰字元 a i 與 a 不相等 那麼我們考慮這樣乙個字串 acdedc 比如現在我們比較去掉第三位的字串和去掉...