Codeforces Problem-1605B Reverse Sort
题目链接
基本思想:
题目的意思在这里就不进行翻译了,直接讲讲算法。通过底下的提示,可以看出来m只有0或1两个选项,在进行交换的时候,我们可以一次性选中要交换的位置,所以m最大为1,而m=0只有在排序过后的字符串和原字符串相等时才满足。
样例一中,由于字符串已经是有序的,所以输出为0;
当m=1的时候,我们可以拿排好序的字符串与原字符串进行比较,如果不相同,k++,同时将下标位置(i+1)存入一个连续空间内,最后按照要求输出即可。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while (t--)
{
int n,m=0;
cin>>n;
string s1,s2;
cin>>s1;
s2=s1;
sort(s2.begin(),s2.end());
if (s1==s2)
m=0;
else
m=1;
cout<<m<<endl;
while (m--)
{
int k=0;
int a[1005];
memset(a,0,sizeof(a));
for (int i=0;i<n;i++)
{
if (s1[i]!=s2[i])
a[k++]=i+1;
}
cout<<k<<" ";
for (int i=0;i<k;i++)
cout<<a[i]<<" ";
cout<<endl;
}
}
return 0;
}