您的位置:首页 > 其它

FOJ--1409--文件压缩--解题报告

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


分析:我分析发现,只要将这个字符串排序后的首尾字母记住就可以了,然后按首字母排序,输出排序后的尾部字母就是了。还有一个就是位置的问题,我是将那个字母的ASCII码值减去50,输出的时候经过判断就能找出这个字母,问题就解决了。

还有需要注意的一点:该题要求的相同字母的相对位置顺序不能改变,而sort不能解决这个问题,要用stable_sort


代码如下:


#include<stdio.h>
#include<algorithm>
usingnamespacestd;
structNode
{
charfirst;
charlast;
}elem[10000];
boolcompare(Nodes1,Nodes2)
{
returns1.first<s2.first;
}
intmain()
{
intn,i,num;
charstr[10001];
scanf("%d",&n);
scanf("%s",str);
for(i=0;i<n;i++)
{
elem[i].first=str[i];
if(i==1)
elem[i].last=str[0]-50;//将字符串的首字母改变
elseif(i==0)
elem[i].last=str[n-1];
else
elem[i].last=str[i-1];
}
stable_sort(elem,elem+n,compare);
for(i=0;i<n;i++)
{
if(elem[i].last<'a')//这个就是首字母
{
printf("%c",elem[i].last+50); //还原
num=i+1; //记录位置
}
else
printf("%c",elem[i].last);
}
printf("/n");
printf("%d/n",num);
return0;
}[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: