给出一个字符串,要求将其通过相邻两项交换进行反转,问需要进行交换多少次?
分析:相邻两项交换,那没事了 一个很显然的逆序对
逆序对的最大特色就是相邻两项交换。
然后我们对交换后的字符串进行分析,找到每一个字符在原字符串中最靠前的位置,原因很显然,小的尽可能放在前面,大的尽可能放到后面。
code:
#include<bits/stdc++.h>
using namespace std;
queue<int>q[200];
int a[200005];
string s;
class nixu{
public:
int tmpA[200005];
long long cnt = 0;
long long get_nixu(int l, int r, int *A){
merge_sort(l,r,A);
return cnt;
}
private:
void merge_sort(int l, int r, int *A) {
if (l >= r) return ;
int mid = (l + r) >> 1;
merge_sort(l, mid, A);
merge_sort(mid + 1, r, A);
int pl = l, pr = mid + 1, tmpp = 0;
while(pl <= mid && pr <= r) {
if (A[pl] <= A[pr]) tmpA[tmpp++] = A[pl++];
else tmpA[tmpp++] = A[pr++], cnt += mid - pl + 1;
}
while(pl <= mid) tmpA[tmpp++] = A[pl++];
while(pr <= r) tmpA[tmpp++] = A[pr++];
for (int i = 0; i < tmpp; i++) A[i + l] = tmpA[i];
}
}NI;
int main()
{
int n;
cin>>n;
cin>>s;
for(int i=0;i<s.length();i++)
{
q[s[i]].push(i+1);
}
for(int i=s.length()-1;i>=0;i--)
{
a[s.length()-i] = q[s[i]].front();
q[s[i]].pop();
}
cout<<NI.get_nixu(1,n,a);
}