题意
给定两个长度为 n(1≤n≤2000) n ( 1 ≤ n ≤ 2000 ) 的字符串 s,t s , t ,问是否能通过不超过 6100 6100 次的 shift s h i f t 操作使得 s s 变成。 shift(x) s h i f t ( x ) 定义为将字符串最后 x x 个字符反转并移至字符串首。若可以,则输出一种可能的方案的操作次数及操作序列。分析
这个数字有点奇怪,事出反常必有妖。再看 n n 的范围,,可以构造一种操作,每次将一个 s s 的字符通过一系列的操作移至最前面与 t t 匹配。
参照这位大佬的博客,每次需要三步操作。
1. 1. shift(n) s h i f t ( n )
2. 2. 设当前与 t t 匹配的字符在中的下标是 j j ,则
3. 3. shift(1) s h i f t ( 1 )代码
#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;
}