P1124 文件压缩 题解

172 阅读1分钟

题目链接

P1124 文件压缩
题目大意:写一个解压程序,具体见题面。

思路

给定的S包含原字符串变换+排序后所得到的n个字符串的尾字母。考虑把S复制到a并将a排序,因为S[i]表示排序后的尾字母,那么a[i]就是对应S[i]的首字母,列出来如下。
  S       a

  • x      a
  • e         e
  • l       e
  • p           l
  • a           m
  • m        p
  • e      x

a为首字母表,S为尾字母表。 已知首字母在S中第7个即e。由题意在首字母表中查找第一个出现的e,在a[2]处。那么这个字符串对应的尾字母就是S[2]=e,并把它加到ans中。再考虑把S[2]作为首字母的情况,那么此时在原串中位于S[2]前面的那个字母正好为尾字母。如此一直查找直到ans长度为n因为对于首字母相同的两个串,按照其出现顺序排序,所以在找之后的字符时要从后向前找

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1E4+10;
int n,p;
char a[N],s[N],ans[N];
inline int read()
{
	int ret=0,flag=1;char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-')flag=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')ret=ret*10+ch-'0',ch=getchar();
	return ret*flag;
}
int main()
{
	n=read();
	cin>>s;
	strcpy(a,s);
	p=read();
	char idx=s[p-1];
	sort(a,a+n);
	int cnt=0;
	for(int i=0;i<n;++i)		//查找首字母 
	{
		if(a[i]==idx)
		{
			idx=s[i];
			ans[cnt++]=s[i];
			a[i]='*';
			break;
		}
	}
	for(int i=n-1;i>=0;--i)		//从后向前找之后的字母 
	{
		if(a[i]==idx)
		{
			idx=s[i];
			ans[cnt++]=s[i];
			a[i]='*';
			i=n;
		}
	}
	for(int i=n-1;i>=0;--i)		//倒序输出 
	cout<<ans[i];
	cout<<endl;
}