codeforces 501 B. Obtaining the String
题目链接:http://codeforces.com/contest/1015/problem/B
题意: 给出字符串s和字符串t,问一个将s变为t的策略。 可以做的变换为,交换s中相邻的字符串,该操作最多不能超过4000次,字符串长度最大为50.
思路:
首先可以确定,当两个字符串的组成相同时(也就是有同样的字符组成,只是位置可能有所不同)一定有解。
考虑最坏情况,每个字符都要交换到最远的地方,总的操作数<50*50<4000,因此一定有解。
判断组成是否相同可以用multiset
/* ***********************************************
Author :111qqz
mail: renkuanze@sensetime.com
Created Time :2018年10月03日 星期三 16时11分29秒
File Name :b.cpp
************************************************ */
#include <bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
typedef long long LL;
#define pi pair < int ,int >
#define MP make_pair
using namespace std;
const double eps = 1E-8;
const int dx4[4]={1,0,0,-1};
const int dy4[4]={0,-1,1,0};
const int inf = 0x3f3f3f3f;
int n;
string s,t;
multiset<char>A,B;
int main()
{
#ifndef ONLINE_JUDGE
freopen("./in.txt","r",stdin);
#endif
cin>>n;
cin>>s>>t;
for ( auto x : s) A.insert(x);
for (auto x: t) B.insert(x);
if (A!=B)
{
puts("-1");
return 0;
}
vector<int>ans;
//可以保证处理过的一定相等
for ( int i = 0 ; i < n ; i++)
{
if (s[i]==t[i]) continue;
string sub_str = s.substr(i,50);
// cout<<"sub_str:"<<sub_str<<endl;
int pos = sub_str.find(t[i])+i;
// cout<<"pos:"<<pos<<endl;
for ( int j = pos; j >= i+1 ; j-- )
{
ans.push_back(j);
swap(s[j-1],s[j]);
// cout<<s<<endl;
}
}
cout<<ans.size()<<endl;
for ( auto x : ans) cout<<x<<" ";
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0;
}