題意
給定兩個長度爲 的字符串 ,問是否能通過不超過 次的 操作使得 變成 。 定義爲將字符串最後 個字符反轉並移至字符串首。若可以,則輸出一種可能的方案的操作次數及操作序列。分析
這個數字有點奇怪,事出反常必有妖。再看 的範圍, ,可以構造一種操作,每次將一個 的字符通過一系列的 操作移至最前面與 匹配。
參照這位大佬的博客,每次需要三步 操作。
設當前與 匹配的字符在 中的下標是 ,則
代碼
#include <bits/stdc++.h>
using namespace std;
const int maxn=2018;
int n;
char s[maxn],t[maxn];
vector <int >ans;
void shift(int x)
{
if(x==0) return ;
reverse(s,s+n);
reverse(s+x,s+n);
ans.push_back(x);
}
int main()
{
scanf("%d%s%s",&n,s,t);
for(int i=0;i<n;++i)
{
int j=i;
while(j<n&&s[j]!=t[n-i-1]) ++j;
if(j==n)
{
printf("-1\n");
return 0;
}
shift(n);
shift(j);
shift(1);
}
printf("%d\n",ans.size());
for(int i=0;i<ans.size();++i)
printf("%d ",ans[i]);
return 0;
}