镇江 网站,网站推广的案例,win2008r做网站,51建模网官方网站给个串#xff0c;只能用操作shift x表示把后面x个字符翻转后放到串的前面。问s串怎么操作能变t串。n2000#xff0c;操作次数6100。 打VP时这转来转去的有点晕。。。 可以想一种逐步构造的方法#xff0c;即从一个小的完成构造的部分通过一顿操作#xff0c;在不影… 给个串只能用操作shift x表示把后面x个字符翻转后放到串的前面。问s串怎么操作能变t串。n2000操作次数6100。 打VP时这转来转去的有点晕。。。 可以想一种逐步构造的方法即从一个小的完成构造的部分通过一顿操作在不影响这部分的前提下扩展。 好吧我看题解了直接丢图是从abc扩展成xabcy的方法如果反了就把他最后再倒过来。 操作次数是$\frac{5}{2}n$的复杂度$kn$$k$指操作次数。 1 //#includeiostream2 #includecstring3 #includecstdlib4 #includecstdio5 //#includemap6 #includemath.h7 //#includetime.h8 //#includecomplex9 #includealgorithm
10 using namespace std;
11
12 int n;
13 #define maxn 10011
14 char s[maxn],t[maxn];int cnts[30],cntt[30],ans[maxn],lans0;
15
16 char tmp[maxn];
17 void shift(int x)
18 {
19 if (x0) {lans--; return;}
20 memcpy(tmp,s,sizeof(char)*(n3));
21 int cnt0; xn-x1;
22 for (int in;ix;i--) s[cnt]tmp[i];
23 for (int i1;ix;i) s[cnt]tmp[i];
24 }
25
26 int findpos(int p,int rr)
27 {
28 for (int irr;i;i--)
29 if (s[i]t[p]) return i;
30 return maxn*2;
31 }
32
33 int main()
34 {
35 scanf(%d,n);
36 scanf(%s,s1); scanf(%s,t1);
37 for (int i1;in;i) cnts[s[i]-a],cntt[t[i]-a];
38 for (int i0;i26;i) if (cnts[i]!cntt[i]) {puts(-1); return 0;}
39
40 int p1(1n)1,p2p1;
41 int pfindpos(p1,n); p1--; p2;
42 if (p!n) {ans[lans]n-p; shift(n-p);}
43 bool rev0;
44 for (int now1,p;p1;p1--,p2,now2,rev^1)
45 {
46 if (rev0) pfindpos(p1,n-now); else pfindpos(p2,n-now);
47 shift(ans[lans]n-p);
48 shift(ans[lans]n);
49 shift(ans[lans]now);
50 if (rev0) pfindpos(p2,n); else pfindpos(p1,n);
51 shift(ans[lans]n-p1);
52 shift(ans[lans]p-now-2);
53 }
54 if (n1) {if (rev) shift(ans[lans]n);}
55 else
56 {
57 if (rev) shift(ans[lans]n-1);
58 else
59 {
60 shift(ans[lans]n-1);
61 shift(ans[lans]1);
62 shift(ans[lans]n);
63 }
64 }
65
66 printf(%d\n,lans);
67 for (int i1;ilans;i) printf(%d ,ans[i]);
68 return 0;
69 } View Code 还有一种好理解的逐个字符构造也是从后往前。 比如说现在串是AzBA的前缀已经是t的一个后缀z是想加在A前面的字符B是剩下的。然后这样AzB-BzA-ABz-zAB。搞定。操作次数3*n。 好吧这是评论写的 转载于:https://www.cnblogs.com/Blue233333/p/8477002.html