FZU 1409 文件压缩
2009-08-03 17:07
375 查看
文件压缩
解题:
一种方法可以使用multimap自动排序,还可以存储相同关键字的值。要寻找第一个元素可以令第一个元素不同任何一个元素,这里将它ASCII码加上一个数字,最后在看下它在哪里即可。
另一种方法,可以用结构体来做。结构体里面可以存储三个变量(或许可以更少),首尾字符,还有尾字符本来的下标(这里都是指排序后的)。题目要求相同首字符不改变相对位置,这里不能使用sort函数,但是可以使用stable_sort()函数来排序,对于STL的各种不同排序,可以看这里。
Time Limit:1s | Memory limit:32M |
Accepted Submit:302 | Total Submit:1026 |
提高文件的压缩率一直是人们追求的目标。近几年有人提出了这样一种算法,它虽然只是单纯地对文件进行重排,本身并不压缩文件,但是对经这种算法调整后的文件进行压缩,在大多数情况下都能获得比原来更大的压缩率。 该算法具体如下:对一个长度为n的字符串S,首先根据它构造n个字符串,其中第i个字符串由S向左循环移位i-1次得到(见示例)。然后把这n个字符串按照首字符从小到大排序。如果两个字符串的首字符相同,则它们的相对位置不变。接着把排序后的字符串的尾字符依次连成一个新的字符串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'和p。 输入输出格式 输入包含两行。第一行为一整数n,1<=n<=10000,表示S的长度;第二行为字符串S,字符串全部由小写字母组成,没有其它字符。 输出两行,第一行为S',第二行为整数p。 输入样例 7 example 输出样例 xelpame 7 Original: FZUPC 2006 |
一种方法可以使用multimap自动排序,还可以存储相同关键字的值。要寻找第一个元素可以令第一个元素不同任何一个元素,这里将它ASCII码加上一个数字,最后在看下它在哪里即可。
另一种方法,可以用结构体来做。结构体里面可以存储三个变量(或许可以更少),首尾字符,还有尾字符本来的下标(这里都是指排序后的)。题目要求相同首字符不改变相对位置,这里不能使用sort函数,但是可以使用stable_sort()函数来排序,对于STL的各种不同排序,可以看这里。
#pragma warning(disable:4786) #include <iostream> #include <string> #include <map> using namespace std; int main() { int n,i,j; string s; multimap <char,char> words; multimap <char,char>::iterator iter; while (cin>>n) { cin>>s; if (n==1) { cout<<s<<endl<<1<<endl; continue; } words.insert(make_pair(s[0],s[n-1])); words.insert(make_pair(s[1],s[0]+60)); for (i=2;i<n;i++) { words.insert(make_pair(s[i],s[i-1])); } for (iter=words.begin(),i=1;iter!=words.end();iter++,i++) { if (iter->second<97 || iter->second>122) { cout<<(char)(iter->second-60); j=i; } else { cout<<iter->second; } } cout<<endl<<j<<endl; words.clear();j=0; } return 0; }
相关文章推荐
- FOJ--1409--文件压缩--解题报告
- FOJ 1409 文件压缩
- Foj 1409 文件压缩
- FOJ 1409 文件压缩
- I - Moon Game FZU - 2148 (叉积,凸四边形)
- 2017年暑假组队训练赛-No.2 F - 牧场物语 FZU - 2234
- POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Network / FZU 1161 (网络流,最大流)
- FZU2277 Change(dfs序+树状数组)
- FZU - 2268 Cutting Game
- fzu —Salty Fish
- fzu-2260
- fzu - 牧场物语-2234 - 动态规划
- fzu-2264
- E - Cutting Game FZU - 2268
- FZU-2150---Fire Game (双向bfs)
- Super A^B mod C FZU - 1759(欧拉降幂+快速密码)
- FZU1686 神龙的难题 —— Dancing Links 可重复覆盖
- FZU - 2254 英语考试 (最小生成树)
- FZU 1977 Pandora adventure (DP)
- bzoj 1409: Password 矩阵乘法+线性筛