P1124 文件压缩 题解
挺有难度的一道模拟题。
以样例为例,在排列并排序后,我们省略中间的字母,是这样的:
a-----x
e-----e
e-----l
l-----p
m-----a
p-----m
x-----e
可以发现,首字母与尾字母是可以相对应的。
样例中 e,然后是其对应的 x;然后找到尾字母是 x 的,知道对应的首字母是 a……以此类推,就可以得到 example。
所以我们只要将尾字母排序就会得到首字母了。
但是,当我们在找对应的字母时,正推字母会乱,举个例子:
5
yxxxx
4
按上面的操作,我们会得到:
x---y
x---x
x---x
x---x
y---x
那这样子去操作,不同的写法会得到不同的答案。
因此,我们选择倒推,来避免这种现象。
AC Code:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,p,now;
string s;
cin>>n>>s>>p;
string t=s;
sort(t.begin(),t.end());
for(int i=1;i<=n;i++)
{
if(t[i]==s[p-1])
{
now=i;
t[i]='$';//标记,下同
break;
}
}//先推出最后一个字母
string ans;
ans.resize(10005);
ans[0]=s[now];
for(int i=1;i<n;i++)
{
for(int j=n-1;j>=0;j--)
{
if(t[j]==s[now])
{
now=j;
ans[i]=s[now];
t[j]='$';
break;
}
}
}
for(int i=n-1;i>=0;i--)//倒序输出
{
cout<<ans[i];
}
return 0;
}