A:
题意:对于一个字符串,通过交换两个相邻字符的形式将原字符串转化成两个完全相同的子串相连的模式。要求出最小的交换次数
思路:只有一个难点。首先处理出两个子串的含有26个字符的数量,通过该数据处理出两个子串的左右两边的“初始状态”。此时虽然两个子串含有字符数量完全相同,但是顺序却可能不同。
通过交换达到字符顺序一样?一眼逆序对的数量。。但是两个字符串比较的逆序对数量。。转换!!! 通过将左边字符的顺序设定为1-n的形式,记录26个字符分别从左到右的顺序,将其按照b的字符顺序依次赋值转化出invert数组
此时求出invert的逆序对就好了。
有人可能会想,这怎么证明呢,实际上,除开逆序对等于交换次数的证明,其余还是很好证明的。首先是左右字符的选取时对ans的影响。由于最后每个字符都是到一个特定位置,总是可以交换出分为左右的情况,其中,最小步数(先选取左边的字符作为第一个子串)是必定会出现的
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string>
#include<bitset>
#include<cmath>
#include<array>
#include<atomic>
#include<sstream>
#include<stack>
#include<iomanip>
//#in