1. 程式人生 > >Codeforces Round #467 (Div. 2) E -Lock Puzzle

Codeforces Round #467 (Div. 2) E -Lock Puzzle

pri DC codeforce col define AI print char .com

Lock Puzzle

題目大意:給你兩個字符串一個s,一個t,長度<=2000,要求你進行小於等於6100次的shift操作,將s變成t,

shift(x)表示將字符串的最後x個字符翻轉後放到最前面。

思路:不會寫,看了題解。。。

因為長度為3000,操作為6500,我們考慮每三次操作將一個字符放到最後,並保證其他字符的順序不變,這樣是可以實現的,

如果我們想要將第k個字符移到最後,我們只要shift(n-1-k) , shift(1) , shift(n-1),就能實現啦 。

 1 #include<bits/stdc++.h>
 2 #define fi first
 3 #define
se second 4 #define mk make_pair 5 #define pii pair<int,int> 6 #define read(x) scanf("%d",&x) 7 #define sread(x) scanf("%s",x) 8 #define dread(x) scanf("%lf",&x) 9 #define lread(x) scanf("%lld",&x) 10 using namespace std; 11 12 typedef long long ll; 13 const int inf=0x3f3f3f3f
; 14 const int INF=0x3f3f3f3f3f3f3f3f; 15 const int N=1e6+7; 16 const int M=2333; 17 18 int n; 19 char s[N],t[N]; 20 vector<int> ans; 21 void shift(int x) 22 { 23 if(x==0) return; 24 reverse(s, s+n); 25 reverse(s+x, s+n); 26 ans.push_back(x); 27 } 28 int main() 29 { 30 read(n);
31 sread(s); sread(t); 32 for(int i=0;i<n;i++) 33 { 34 int now=0; 35 while(s[now]!=t[i]) 36 now++; 37 if(now>=n-i) 38 { 39 puts("-1"); 40 return 0; 41 } 42 shift(n-1-now); 43 shift(1); 44 shift(n-1); 45 } 46 printf("%d\n",ans.size()); 47 for(int i:ans) 48 printf("%d ",i); 49 puts(""); 50 return 0; 51 } 52 /* 53 */

Codeforces Round #467 (Div. 2) E -Lock Puzzle