題解 P5329 SNOI2019 字串

2022-08-21 00:06:16 字數 1171 閱讀 8379

用棧的做法來水一發。

首先我們有乙個暴力的做法,列舉每個被刪除的字元,然後排序輸出,時間複雜度:$ o ( n \times n \times logn ) $ 。

然後我們觀察一下資料,發現有乙個資料點且任意兩個相鄰字元 $ a_i $ 與 $ a_ $ 不相等;那麼我們考慮這樣乙個字串: $ acdedc $ 。比如現在我們比較去掉第三位的字串和去掉第四位的字串。我們發現 $ acddc $ 比 \(acdec\) 小,然後我們再發現除 $ 3,4 $ 位的以外的都是一樣的,所以直接比較第三位第四位就可以啦。現在就是要考慮去掉當前位置如何與前面所有的字串比較。我們發現一旦去掉第二位比第三位來的大那麼後面不管去掉哪一位都不可能超過第二位。同理如果當前這一位比不過後一位的話,接下來的所有位他都比不過,就可以直接輸出了。所以我們把後面所有字串都打不過的位置用棧記下來,把後面所有字串都打得敗的直接輸出,這樣我們就又多了 \(20\) 分的好成績。

現在我們考慮有相鄰有重複的情況,顯然我們可以把相鄰一樣的區間看成乙個字母來做,這樣就可以 $ o( n ) $ 實現。

#include#include#include#include#include#define inf 1ll<<62;

#define ll long long

#define for(x,from,to) for(ll x=from;x<=to;x++)

using namespace std;

const int maxn=1e6+5;

char str[maxn];

ll n,cnt,ans[maxn],last,s[maxn];

bool flag;

ll qp(ll b,ll k)

templatevoid read(t &x)

while(ch>='0' && ch<='9')

x=f? -x:x;

}templateinline void write(t x)

if(x>9) write(x/10);

putchar((x%10)^48);

}int main()

for(int i=last;i<=n;i++)

while(cnt)

return 0;

}//完美撒花。qwq

qwq

洛谷 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 字串

題目大意 給乙個長度為 n 的字串 s 字串 p i 為字串 s 去掉第 i 個字元後形成的字串。請給所有字串 p i 排序 相同字串按編號排序 題解 先去掉所有連續相同字元,因為它們形成的字串一定相同 也就是說只按編號排序 然後發現對於兩個字串 p i,p j i卡點 無 c code inclu...