题目链接:http://acm.swust.edu.cn/problem/138/

Time limit(ms): 1000      Memory limit(kb): 65535
 

Description

提高文件的压缩率一直是人们追求的目标。近几年有人提出了这样一种算法,它虽然只是单纯地对文件进行重排,本身并不压缩文件,但是经这种算法调整后的文件在大多数情况下都能获得比原来更大的压缩率。 该算法具体如下:对一个长度为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。

Input

输入文件共有三行,第1行是一个整数n(1<=n<=10000),代表S’的长度,第2行是字符串S’,第3行是整数p。

Output
仅包含一行S。
 
Sample Input
7
xelpame
7
Sample Output
example
 
 
解题思路:这道题感觉太诡异了(想得整个人都不好了~~),这是一个逆向求解得过程,就好比密码破译,只不过你知道了关键的key;
 
(1)观察没有排序的已经构造好的序列前一个字符串的第一个字符是下一个字符串的最后一个字符;
(2)由于原始单词第一个字符位置已知,而我们通过对转换好的字符排序,得到了排序过后的字符串的首字母;
(3)排序时是首字母相同按出现次序先后排序;
 
我们通过以上3点从原始字符的最后一个出发利用(1)的规则结合(2)的特性,找到排列好的字符串第一个字符与当前标识符(初始是第一个字符,可以查找到原始序列最后一个字符)相等的字符串,其最后字符(输入的字符串对应位置的元素)为所求,以此类推,逆序得到完整原始字符串,然后倒序输出;
主要代码如下:
for (i = ; i < len; i++)
if (ss[i] == c)break;
ans[] = se[i];
c = se[i];
ss[i] = '#';
for (i = len - ; i >= ; i--){
if (ss[i] == c){
c = se[i];
ans[cnt++] = c;
ss[i] = '#';
i = len;
}
}

结合上面三点仔细体会~~~

完整代码如下:

 #include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
int len, p, i;
while (cin >> len){
char se[], ss[], ans[], c;
int cnt = ;
cin >> se >> p;
if (len == ){
cout << se << endl;
continue;
}
strcpy(ss, se);
sort(ss, ss + len);
c = se[p - ];
for (i = ; i < len; i++)
if (ss[i] == c)break;
ans[] = se[i];
c = se[i];
ss[i] = '#';
for (i = len - ; i >= ; i--){
if (ss[i] == c){
c = se[i];
ans[cnt++] = c;
ss[i] = '#';
i = len;
}
}
for (i = len - ; i >= ; i--)
cout << ans[i];
cout << endl;
}
return ;
}

[Swust OJ 138]--文件压缩的更多相关文章

  1. Linux 文件压缩与归档

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  2. php多文件压缩下载

    /*php多文件压缩并且下载*/ function addFileToZip($path,$zip){ $handler=opendir($path); //打开当前文件夹由$path指定. whil ...

  3. Zip文件压缩(加密||非加密||压缩指定目录||压缩目录下的单个文件||根据路径压缩||根据流压缩)

    1.写入Excel,并加密压缩.不保存文件 String dcxh = String.format("%03d", keyValue); String folderFileName ...

  4. Java实现文件压缩与解压

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例.(转载自http://www.puiedu. ...

  5. 下载zip格式文件(压缩Excel文件为zip格式)

    Mongodb配置文件参考这一篇:http://www.cnblogs.com/byteworld/p/5913061.html package util; import java.io.Buffer ...

  6. 分享一个ASP.NET 文件压缩解压类 C#

    需要引用一个ICSharpCode.SharpZipLib.dll using System; using System.Collections.Generic; using System.Linq; ...

  7. 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期

    [源码下载] 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的 ...

  8. linux文件压缩与打包

    在linux中常见的压缩命令 首先,在linux中压缩文件的扩展名大多是 *.gz gzip程序压缩的文件 *.bz2 bzip2程序压缩的文件 *.tar tar程序打包的数据,并没有压缩过 *.t ...

  9. 关于ZIP大文件压缩

    实测:4.76 GB一个单文件压缩没有什么问题. import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...

随机推荐

  1. Struts学习之值栈的理解

    转自:http://blog.csdn.net/hanxuemin12345/article/details/38559979 页面一个请求发送过来,依次经过一系列拦截器(处理公共部分,如:往数据中心 ...

  2. Oracle系统视图

    VIEW TABLES 1.DBA_TABLES --查看系统里所有表的信息,只有DBA权限用户才可查看 SELECT * FROM DBA_TABLES WHERE OWNER='HR' AND T ...

  3. [LeetCode]题解(python):105-Construct Binary Tree from Preorder and Inorder Traversal

    题目来源: https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 题意分析: ...

  4. 调不尽的内存泄漏,用不完的Valgrind

    调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1. 到www.valgrind.org下载最新版valgrind-X.X.X.tar.bz2 2. 解压安装包:tar –jxvf ...

  5. MVC-Easy-UI-datagrid-分页-查询

    时间仓促,代码写的乱,莫怪,着影区不用理会(功能之外) <link href="@Url.Content("~/Content/Site.css")" r ...

  6. linux历史发展

    1.什么是开源? 开源就是软件和源代码都是公开的. 可以修改(完善作者的代码)和创建自己的软件. 2.免费软件不同于自由软件,虽然它是免费的,但他不公布源代码,共享软件与免费软件有点类似,其初起是不收 ...

  7. HDU 2719 The Seven Percent Solution

    #include <cstdio> #include <cstring> int main() { ]; ]!='#') { ; while (i<strlen(s)) ...

  8. windows上放弃使用PyGTK

    windows上放弃使用PyGTK - riag的专栏 - 博客频道 - CSDN.NET windows上放弃使用PyGTK 分类: python 2010-03-31 16:47 1054人阅读 ...

  9. Xcode - 内存分析

    内存分析工具 1. ARC中的内存泄露 1. 一般内存分析, 主要是看看有没有内存泄露 2. 内存泄露: 创建了对象, 使用完毕没有释放, 将来就可能造成内存泄露 3. 内存泄露: 主要用于MRC的内 ...

  10. MBProgressHUD简单使用

    使用HUD最多的情形用于请求等待提示 例如做登录的时候在确认登陆的时候可以用HUD提示正在登陆. 最基本的使用 初始化 //self.view代表在哪个view中显示hud MBProgressHUD ...