文件壓縮【字符串】

提高文件的壓縮率一直是人們追求的目標。近幾年有人提出了這樣一種算法,它雖然只是單純地對文件進行重排,本身並不壓縮文件,但是經這種算法調整後的文件在大多數情況下都能獲得比原來更大的壓縮率。 該算法具體如下:對一個長度爲n的字符串S,首先根據它構造n個字符串,其中第i個字符串由將S的前i-1個字符置於末尾得到。然後把這n個字符串按照首字符從小到大排序,如果兩個字符串的首字符相等,則按照它們在S中的位置從小到大排序。排序後的字符串的尾字符可以組成一個新的字符串S’,它的長度也是n,並且包含了S中的每一個字符。最後輸出S’以及S的首字符在S’中的位置p。

舉例: S: example

1、構造n個字符串 example xamplee ampleex mpleexa pleexam leexamp eexampl

2、將字符串排序 ampleex example eexampl leexamp mpleexa pleexam xamplee

3、壓縮結果 S’= xelpame ,p=7

由於英語單詞構造的特殊性,某些字母對出現的頻率很高,因此在S’中相同的字母有很大機率排在一起,從而提高S’的壓縮率。雖然這種算法利用了英語單詞的特性,然而在實踐的過程中,人們發現它幾乎適用於所有的文件壓縮。

請你編一個程序,讀入S’和p,輸出字符串S。


如題意:"①按首字符從小到大排序,若兩字符串首字符相等,②則按其

在S中位置從小到大排序。"

依①,必得首字符遞增序列,設其爲c。

故此序列可由所給字符串s排序得,且與s首尾一一對應。

這種首尾關係,體現在原序列上是相鄰。

即s內字符在原序列中是c內字符前一位。

故當確定一字符位置,可推其餘字符位置。

現在暴力分析:

由於②,該排序方式體現在c上,原序列一定有重複字母。

所以只能由c推,所以只能從後往前推(c->s)。

已知第一字符,由於其位置第一,在c中必爲相等字符之首。

由此,線性推。
int main() {
	ll n, p; string s;
	while (cin >> n >> s >> p) {
		string t = s, res;
		sort(t.begin(), t.end());
		p = t.find(s[p - 1]);//p-1號是相同元素中最靠前的
		while (res.size() < n) {
			ll id = -1;
			//s[p]肯定是t中後出現的元素 因爲倒推
			for (int j = n - 1; j >= 0; j--)if (t[j] == s[p]) { id = j; break; }
			res += t[id]; t[id] = ' '; p = id;
		}
		reverse(res.begin(), res.end());
		cout << res << endl;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章