題目鏈結
提高檔案的壓縮率一直是人們追求的目標。近幾年有人提出了這樣一種演算法,它雖然只是單純地對檔案進行重排,本身並不壓縮檔案,但是經這種演算法調整後的檔案在大多數情況下都能獲得比原來更大的壓縮率。
該演算法具體如下:對乙個長度為
n n
的字串
s' role="presentation" style="position: relative;">s
s,首先根據它構造
n n
個字串,其中第
i' role="presentation" style="position: relative;">i
i個字串由將
s s
的前i−1
' role="presentation" style="position: relative;">i−1
i−1個字元置於末尾得到。然後把這
n n
個字串按照首字元從小到大排序,如果兩個字串的首字元相等,則按照它們在
s' role="presentation" style="position: relative;">s
s中的位置從小到大排序。排序後的字串的尾字元可以組成乙個新的字串
s s
』,它的長度也是
n' role="presentation" style="position: relative;">n
n,並且包含了
s s
中的每乙個字元。最後輸出
s' role="presentation" style="position: relative;">s
s』以及
s s
的首字元在
s' role="presentation" style="position: relative;">s
s』中的位置
p p
。舉例:
s:example
1、構造
n' role="presentation" style="position: relative;">n
n個字串
example
xamplee
ampleex
mpleexa
pleexam
leexamp
eexampl
2、將字串排序
ampleex
example
eexampl
leexamp
mpleexa
pleexam
xamplee
3、壓縮結果xe
lpam
e xel
pame
s s
』7' role="presentation" style="position: relative;">77p
p由於英語單詞構造的特殊性,某些字母對出現的頻率很高,因此在
s' role="presentation" style="position: relative;">s
s』中相同的字母有很大機率排在一起,從而提高
s s
』的壓縮率。雖然這種演算法利用了英語單詞的特性,然而在實踐的過程中,人們發現它幾乎適用於所有的檔案壓縮。
請你編乙個程式,讀入
s' role="presentation" style="position: relative;">ss』和
p p
,輸出字串
s' role="presentation" style="position: relative;">ss。
輸入格式:
共三行。
第一行是乙個整數n(
1≤n≤
10000
) n(1
≤n
≤10000
),代表s
s』的長度。
第二行是字串
s' role="presentation" style="position: relative;">s
s』。
第三行是整數
p p
。輸出格式:
一行,s。
輸入樣例#1:複製
7xelpame
7
輸出樣例#1:複製
example
這道題比較細緻,需要慢慢地思考找規律,非常容易出錯。找了幾個題解之後細緻比較知道了正解:
copy一下字元陣列orig陣列
,然後排個序(從大到小)變成srt陣列
利用給出地p
按順序遍歷srt
找到第乙個等於orig[p]
的,其對應的字元就是壓縮前字串的最後乙個字元,然後倒著遍歷srt陣列
,找到第乙個等於該字元的,其對應的字元就是倒數第二個字元,不斷這樣尋找,直到逆序地找出整個字串。
為什麼剛開始要順序而後來是逆序呢?這是因為開始查詢的是第乙個字元,由於排序的原因,和它相同的字元都在它之後,所以找到順序第乙個。而後面的查詢由於是從後往前查詢,所以同理的,應該找到逆序第乙個。
這種方法是倒序查詢,那麼可不可以順序查詢呢?
我認為是不可以的。因為之所以倒敘查詢可行,是因為壓縮時有如果兩個字串的首字元相等,則按照它們在ss中的位置從小到大排序
這個規則,而順序由於是找壓縮後的順序,但由於右邊的字元沒有滿足這個規則,所以順序是不確定的。也就是說在某些題目裡面可以是正確的,但在大多數題目裡是不符合要求的。
參考鏈結
參考**
#include
#include
using
namespace
std;
int main()
sort(srt + 1, srt + n + 1);
cin >> p;
char ans[10005];
char c = orig[p];
bool vis[10005] = {};
for (int i = 1; i <= n; ++i)
}int cnt = 0;
ans[++cnt] = c;
for (int i = n; i > 0; --i)
}for (int i = cnt; i > 0; --i) }/*
7xelpame
7*/
LG P1124 檔案壓縮
p1124 檔案壓縮 題目背景 提高檔案的壓縮率一直是人們追求的目標。近幾年有人提出了這樣一種演算法,它雖然只是單純地對檔案進行重排,本身並不壓縮檔案,但是經這種演算法調整後的檔案在大多數情況下都能獲得比原來更大的壓縮率。題目描述 該演算法具體如下 對乙個長度為n的字串s,首先根據它構造n個字串,其...
python3 資料夾下所有檔案 字串替換
替換資料夾下所有檔案中的字串。coding utf8 from os import chdir,getcwd,listdir,path import codecs import re def excuepath folder path,blacklist,extends chdir folder p...
Lua雜記一 檔案讀寫 table庫 字串庫
一 table的解釋 雲風說的很好,摘抄如下 lua 的整體效率是很高的,其中,它的 table 實現的很巧妙為這個效率貢獻很大。lua 的 table 充當了陣列和對映表的雙重功能,所以在實現時就考慮了這些,讓 table 在做陣列使用時盡量少效率懲罰。lua 是這樣做的。它把乙個 table 分...