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

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 */

原文地址:https://www.cnblogs.com/CJLHY/p/8512055.html

时间: 2024-10-13 01:02:00

Codeforces Round #467 (Div. 2) E -Lock Puzzle的相关文章

Codeforces Round #467 (Div. 2)

A Olympiad 输出除0以外的数字种数即可. B Vile Grasshoppers 猜想答案离y不会很远.暴力枚举答案, $O(\sqrt n)$验证,如果有因数落在区间$[2,p]$里就不合法. C Save Energy! 二分答案搞一搞. D Sleepy Game 如果走到一个出度为零而且该对面走的点p就赢了.如果有环就可以平局.否则就输了. 找到点p之后往回走走到起始点就行了,记录下这条路径. E Lock Puzzle 先坑着. 1 #include<cstdio> 2 #

Codeforces Round #467 (Div. 2) -----d

D. Sleepy Game 又是好几天之前的题目了,这几天一直沉迷于王者农药,今天总算把这道题写了. 考试的时候:看完题面,博弈论????emmm好像从出度为0的点倒着递推过来就行了?(从来没写过博弈论),可是平局怎么弄,,,行吧不写了(没时间了). 考完之后跟同学说这道题,他告诉我这不是个博弈问题....又去认认真真读了一遍样例,确实不是. 官方拖了好几天才发题解. 先看赢的情况,这不是一个博弈问题,后手要帮着先手赢的,所以其实就是找一条路径,从s开始,经过奇数条边,最终到达的点出度为0.那

贪心 Codeforces Round #301 (Div. 2) A. Combination Lock

题目传送门 1 /* 2 贪心水题:累加到目标数字的距离,两头找取最小值 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <cstring> 8 using namespace std; 9 10 const int MAXN = 1e3 + 10; 11 const int INF = 0x3f3f3f3f; 12 char s[MAXN],

Codeforces Round #262 (Div. 2) B

题目: B. Little Dima and Equation time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Little Dima misbehaved during a math lesson a lot and the nasty teacher Mr. Pickles gave him the following pr

Codeforces Round #301 (Div. 2) -- (A,B,C,D)

题目传送:Codeforces Round #301 (Div. 2) A. Combination Lock 水题,求最小移动次数,简单贪心一下即可 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #i

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd