CF936C Lock Puzzle

题目链接:戳我

APIO2019 practice round E题的弱化版

考虑如何构造。

对于一个字符串a:
(未构造好的)+a[pos]+(已构造好的)

1、将已经构造好的按照题目意思翻转,接到前面
(反着的已构造好的)+(未构造好的)+a[pos]
2、将a[pos]按照题目意思翻转(但是因为它就一个数,所以还是不变),接到前面
a[pos]+(反着的已构造好的)+(未构造好的)
3、翻转长度为n,接到前面(因为是所有的了,所以接到前面这一步相当于没有,该操作等效于整体翻转)
(未构造好的)+(已构造好的)+a[pos]

这样子我们就把a[pos]接到已经构造好的后面了。

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define MAXN 100010
using namespace std;
int n;
char a[MAXN],b[MAXN],tmp[MAXN];
vector<int>ans;
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d",&n);
    scanf("%s%s",a+1,b+1);
    int len=0,pos,cnt=0;
    while(cnt<n)
    {
        bool flag=false;
        for(int i=n-len;i>=1;i--)
        {
            if(a[i]==b[cnt+1])
            {
                cnt++,pos=i;
                flag=true;
                break;
            }
        }
         if(flag==false)
        {
            printf("-1\n");
            return 0;
        }
        len++;
        ans.push_back(n-pos),ans.push_back(1),ans.push_back(n);
        int kkk=1;
        for(int i=n;i>=pos+1;i--) tmp[++kkk]=a[i];
        tmp[1]=a[pos];
        for(int i=1;i<pos;i++) tmp[++kkk]=a[i];
        reverse(&tmp[1],&tmp[n+1]);
        memcpy(a,tmp,sizeof(tmp));
    }
    printf("%d\n",n*3);
    for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
    return 0;
}

原文地址:https://www.cnblogs.com/fengxunling/p/10884500.html

时间: 2024-10-15 08:55:03

CF936C Lock Puzzle的相关文章

HDU 4708 Rotation Lock Puzzle (贪心+模拟)

Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1668    Accepted Submission(s): 530 Problem Description Alice was felling into a cave. She found a strange door with a number

hduoj 4708 Rotation Lock Puzzle 2013 ACM/ICPC Asia Regional Online —— Warmup

http://acm.hdu.edu.cn/showproblem.php?pid=4708 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Alice was felling into a cave. She found a strange door with a number square m

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 #incl

HDU 4708 Rotation Lock Puzzle(数学啊)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4708 Problem Description Alice was felling into a cave. She found a strange door with a number square matrix. These numbers can be rotated around the center clockwise or counterclockwise. A fairy came an

HDU4708 Rotation Lock Puzzle 不错的模拟题

题意:给你一个n*n的矩阵,n为奇数,以最中心的一个数为基准,可以把这个矩阵 看成一圈一圈的,每一圈都可以逆时针或者顺时针旋转,每一次旋转每个元素只能移动一个单元格,求经过每一圈的旋转矩阵两个对角线和最大的值,并求出最少旋转次数 一圈一圈的处理,注意最中心的那个数不用管,就它一个,那么这个矩阵只有n/2圈需要操作,对于每一圈的元素都放在一个一维数组里面,然后枚举这个数组里的每一个元素为开头,统计接下来的三个数,求和比较大小即可,因为有逆时针的,所以顺时针时从开头开始枚举,逆时针则从尾部开始枚举,

HDU 4708 Rotation Lock Puzzle

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4708 测试数据: 51 9 9 1 11 9 9 9 99 9 9 9 99 9 9 9 11 1 9 9 1 81 1 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 long long a[15][15]; 6 long long step,an

CF 936C Lock Puzzle——构造

题目:http://codeforces.com/contest/936/problem/C 玩了一个小时,只能想出 5*n 的方法. 经过一番观察?考虑这样构造:已经使得 A 串的一个后缀 = B 串的一个前缀,考虑再把一个正确的字符挪到 A 串的最后面. 设该字符为 x .它之前有 len 个字符.当前已经弄好的结尾长度为 l2 . 进行这5个操作:n-len , len , n-len-l2 , l2 , n-l2+1 . 思路就是: 1&2:使得 x 变成结尾: 3:使 x 变成开头.原

HDU 4708

对每个环都进行遍历,找出最大值 如果值相等的话就可以还要判断下走的步数 Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1369    Accepted Submission(s): 431 Problem Description Alice was felling into a cave. S

模拟2

    ID Origin Title 6 / 10 Problem A HDU 4706 Children's Day 7 / 22 Problem B HDU 4707 Pet 5 / 25 Problem C HDU 4708 Rotation Lock Puzzle 6 / 26 Problem D HDU 4709 Herding 1 / 9 Problem E HDU 4710 Balls Rearrangement     Problem F HDU 4711 Weather