題目大意:給乙個長度為$n$的字串$s$,字串$p_i$為字串$s$去掉第$i$個字元後形成的字串。請給所有字串$p_i$排序(相同字串按編號排序)
題解:先去掉所有連續相同字元,因為它們形成的字串一定相同(也就是說只按編號排序)。然後發現對於兩個字串$p_i,p_j(i卡點:無
c++ code:
#include #include #include #define maxn 1000010int 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 比如現在我們比較去掉第三位的字串和去掉...