http://codeforces.com/contest/937/problem/E
题意:
给你一个shift(x)操作:把最后x个字符倒一下,提到最前面。问你如何从S到T。
操作不能超过6100。
POINT:
用三个shitf操作,可以把某个位置的数提到最前面(且他前面的数顺序保持不变)。
要把第i个数提到最前面。操作是. shift(n),shift(i-1),shift(1).
这样这个问题就解决了。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <vector>
using namespace std;
#define LL long long
char s[2222],t[2222];
int n;
vector<int>ans;
void haha(int x)
{
if(x==0) return;
ans.push_back(x);
char temp[2222];
int cnt=0;
for(int i=n;i>=n-x+1;i--){
temp[++cnt]=s[i];
}
for(int i=1;i<n-x+1;i++){
temp[++cnt]=s[i];
}
for(int i=1;i<=n;i++)
s[i]=temp[i];
}
int main()
{
cin>>n;
scanf("%s",s+1);
scanf("%s",t+1);
int len = n;
while(len>0){
int flag=0;
for(int i=n-len+1;i<=n;i++){
if(t[len]==s[i]){
if(i!=1){
haha(n);
haha(i-1);
haha(1);
}
flag=1;
len--;
break;
}
}
// printf("%s\n",s+1);
if(!flag) break;
}
if(len==0){
printf("%d\n",(int)ans.size());
for(int i=0;i<ans.size();i++)
printf("%d ",ans[i]);
}else{
printf("-1\n");
}
}