题目链接
P1124 文件压缩
题目大意:写一个解压程序,具体见题面。
思路
给定的包含原字符串变换
排序后所得到的
个字符串的尾字母。考虑把
复制到
并将
排序,因为
表示排序后的尾字母,那么
就是对应
的首字母,列出来如下。
称为首字母表,
为尾字母表。
已知首字母在
中第
个即
。由题意在首字母表中查找第一个出现的
,在
处。那么这个字符串对应的尾字母就是
,并把它加到
中。再考虑把
作为首字母的情况,那么此时在原串中位于
前面的那个字母正好为尾字母。如此一直查找直到
长度为
。因为对于首字母相同的两个串,按照其出现顺序排序,所以在找之后的字符时要从后向前找。
代码
#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;
}