APIO 2018 Practice Session T3 / CF 936C Lock Puzzle

2023-05-16

          • 传送门
          • 题目大意
          • 思路
          • 参考代码
          • 总结

传送门
题目大意

给你一个字符串 origin,一个字符串 target,长度均为 n n 。要求在 3n 52n 5 2 n )次操作以内将 origin 变成 target。操作是:对于字符串 S S ,我们将它表示成 αβ 的形式,操作之后这个字符串将会变成 βRα β R α ,其中 R R 表示将字符串反转。 α α β β 可以为空串。

思路

唉,我太弱了,什么都不会,一开始还以为求最少操作次数,后来发现是给出方案即可,但是完全没思路。唉,我太弱啦!

一般这种变换式的构造题都可以一步一步构造,即在不改变已经构造好了的部分的前提下扩大构造的范围。但是我太弱了,看到了这个思路,我也只想到了 4n 4 n 的解法。

我们逐步构造 target 的后缀,把它放到 origin 的最前面去。设字符串 v1w2 v 1 w 2 表示 origin,其中 v v 表示已经构造好了的后缀,w 表示后缀前面要接的一个字符(显然长度为 1 1 ),1 2 2 表示夹在它们之间的其它串。我们这样变化:

v1w22Rwv11RvRw2R21RvRwwv21R

显然 wv w v 是我们想要的,因此我们得到了一个 4n 4 n 的做法,在练习赛中获得了很弱的 78 78 分,唉,我太弱啦!


我们还是用这个思路:

v1w22Rw1RvRv12Rwwv12R ∣ v 1 w 2 ↓ 2 R w ∣ 1 R v R ↓ v 1 2 R ∣ w ↓ w v 1 2 R

这样我们得到了一个 3n 3 n 的做法,通过了 CF 936C,并在练习赛中得到了很弱的 89 89 分,看来要拿铁牌了,唉,我太弱啦!

参考代码

(两道题输入不一样,下面这个是 CF 936C)

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cassert>
#include <cctype>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <list>
#include <functional>
typedef long long LL;
typedef unsigned long long ULL;
using std::cin;
using std::cout;
using std::endl;
typedef LL INT_PUT;
INT_PUT readIn()
{
    INT_PUT a = 0; bool positive = true;
    char ch = getchar();
    while (!(ch == '-' || std::isdigit(ch))) ch = getchar();
    if (ch == '-') { positive = false; ch = getchar(); }
    while (std::isdigit(ch)) { a = a * 10 - (ch - '0'); ch = getchar(); }
    return positive ? -a : a;
}
void printOut(INT_PUT x)
{
    char buffer[20]; int length = 0;
    if (x < 0) putchar('-'); else x = -x;
    do buffer[length++] = -(x % 10) + '0'; while (x /= 10);
    do putchar(buffer[--length]); while (length);
}

const int maxn = 2005;
int n, m;
char origin[maxn];
char target[maxn];
int bound;
int disc[maxn];
int disc2[maxn];

#define RunInstance(x) delete new x
struct cheat1
{
    std::vector<int> ans;
    void handle(int x)
    {
        if (!x) return;
        ans.push_back(x);
        static char temp[maxn];
        int t = 0;
        for (int i = n; i > n - x; i--)
            temp[++t] = origin[i];
        for (int i = 1; i <= n - x; i++)
            temp[++t] = origin[i];
        memcpy(origin + 1, temp + 1, sizeof(char) * t);
    }
    cheat1()
    {
        for (int i = 1; i <= n; i++)
        {
            char wanted = target[n - i + 1];
            int pos = i;
            while (origin[pos] != wanted)
                pos++;
            handle(n - pos + 1);
            handle(pos);
            handle(n - pos);
            handle(i);
        }
        printOut(ans.size());
        putchar('\n');
        for (int i = 0; i < ans.size(); i++)
        {
            printOut(ans[i]);
            putchar(' ');
        }
    }
};
struct cheat2
{
    std::vector<int> ans;
    void handle(int x)
    {
        if (!x) return;
        ans.push_back(x);
        static char temp[maxn];
        int t = 0;
        for (int i = n; i > n - x; i--)
            temp[++t] = origin[i];
        for (int i = 1; i <= n - x; i++)
            temp[++t] = origin[i];
        memcpy(origin + 1, temp + 1, sizeof(char) * t);
    }
    cheat2()
    {
        for (int i = 1; i <= n; i++)
        {
            char wanted = target[n - i + 1];
            int pos = i;
            while (origin[pos] != wanted)
                pos++;
            handle(n);
            handle(pos - 1);
            handle(1);
        }
        printOut(ans.size());
        putchar('\n');
        for (int i = 0; i < ans.size(); i++)
        {
            printOut(ans[i]);
            putchar(' ');
        }
    }
};

void run()
{
    n = readIn();
    scanf("%s%s", origin + 1, target + 1);
    for (int i = 1; i <= n; i++)
    {
        disc[++bound] = origin[i];
        disc2[bound] = target[i];
    }
    std::sort(disc + 1, disc + 1 + bound);
    std::sort(disc2 + 1, disc2 + 1 + bound);
    for (int i = 1; i <= bound; i++)
        if (disc[i] != disc2[i])
        {
            printOut(-1);
            return;
        }

    RunInstance(cheat2);
}

int main()
{
#ifdef LOCAL
    freopen("E.in", "r", stdin);
#endif
    run();
    return 0;
}
总结
  1. 认真读题,逐字逐句翻译读题(说翻译好像没什么不对的),仔细理解题目的意思!
  2. 构造题考虑从小到大逐步扩展,有点解决子问题的味道。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APIO 2018 Practice Session T3 / CF 936C Lock Puzzle 的相关文章

  • 缓存 VS 会话 VS cookie?

    缓存 会话 Cookie 的注意事项是什么 例如 我经常使用会话变量 有时当用户开始订购产品然后去吃午餐并在几个小时后回来并继续预订时 预订应用程序中有时会出现问题 我将预订存储在会话中 直到用户确认或中止预订 因此当用户只需单击浏览器中的
  • Rails 会话中存储的对象变成了字符串?

    通常我不会在 Rails 会话中存储对象 但我正在使用需要此功能的库 我遇到了一个非常奇怪的问题 其中存储的对象在重定向后显示为字符串 为了重现 我创建了一个示例 Rails 4 1 应用程序 rails new session test
  • 扩展 ASP.NET 应用程序

    这是一个非常广泛的问题 但希望我能得到有用的提示 目前我有一个在单个服务器上运行的 ASP NET 应用程序 我现在需要进行扩展以适应不断增加的客户负载 所以我的计划是 1 将 ASP NET 和 Web 组件扩展到五台服务器上 2 将数据
  • PHP 会话不工作

    我正在使用 wamp2 0 PHP 5 3 apache 2 2 11 但我的会话不存储数据 我有一个接受参数的页面 我想将其 简化版本 存储在会话中 所以当我来到 http www example com home php sessid
  • “location.reload()”丢失 POST/SESSION 数据? (F5 / Ctrl+R 保留数据?)

    我想创建一个按钮来重新加载页面而不丢失 POST数据和 SESSION 在网上 我找到了这段代码 onclick document location reload 这是我的按钮的代码 a class button href style fo
  • 函数 session_start() 出现问题(运行缓​​慢)

    我有一个问题session start 在主服务器上 当我第一次加载页面时 完成请求只需要不到 1 秒的时间 如果我等待大约 12 15 秒 然后重新加载页面 加载时间将是相同的 但是 当我尝试在初始加载后 3 或 5 秒后刷新页面时 服务
  • IllegalStateException:getAttribute:会话已失效

    我的第一个 JSF IceFaces 版本 1 8 2 应用程序在 JBoss 5 1 0 上运行时遇到问题 一段时间后我收到一个异常 告诉我有关会话问题 这很奇怪 因为我根本不在我的代码中使用会话 以下日志显示由于此错误 来自 JBoss
  • 在 ASP.NET MVC ViewModel 中存储模型 ID,安全问题

    在我的 MVC 应用程序中 我有一个页面供用户编辑其帐户详细信息 例如电子邮件地址 密码等 在我的数据库中 用户表保存此数据 主键是 UserId 在我创建的 ChangeAccountDetails 视图上 我传递了一个 ViewMode
  • setcookie() 和 session_set_cookie_params() 函数之间的区别

    我试图理解 PHP 函数 setcookie 和 session set cookie params 之间的区别 看起来两个函数都在执行相同类型的任务 但 setcookie 可用于创建具有名称和值的 cookie 我试图理解 PHP 手册
  • 使用Rvest登录网站抓取时出现403错误

    我试图在需要登录的网站上抓取页面 但不断收到 403 错误 我已经修改了我网站的这两篇文章中的代码 使用rvest或httr登录网页上的非标准表单 https stackoverflow com questions 28418770 usi
  • Cookie 未设置或首次不起作用

    在每个页面上 我都设置了一个 cookie 来为与该会话对应的标题按钮着色 问题是 当我第一次在不同的部分打开页面时 cookie 仍然是旧的 彩色按钮也是如此 然后 如果我再次单击同一按钮 则 cookie 会被正确设置 为什么 这是我的
  • 使用 google app-engine 跨浏览器/服务器重新启动会话持久性

    如何使会话在浏览器 服务器重新启动后持续存在 我正在使用谷歌应用程序引擎 每次重新启动浏览器和 或服务器时 我都会得到一个新的会话 ID String jSessionId this getThreadLocalRequest getSes
  • Symfony2 - 访问被拒绝(用户未经过完全身份验证)

    我正在使用 Symfony2 开发一个网站 直到今天 登录没有问题 但现在登录时我没有正确验证 Symfony 分析器将我列为logged in as anon而不是我登录的用户 我还被重定向回登录页面而不是目标路径 登录过程由传统的登录表
  • 无法加载请求的类:会话

    我的配置文件看起来像这样 gt config sess cookie name ci session config sess expiration 7200 config sess expire on close TRUE config s
  • 使用 REST API 进行正确的会话管理

    我已经完成了 RESTful API 的设计 其中我使用作为参数发送的 API 令牌对每个请求进行身份验证 现在我想创建一个客户端界面 我想知道什么是管理每个客户端的会话的正确安全方法browser客户 我想过一个流程来保持服务器端无状态
  • Flask 会话不持久(Postman 有效,Javascript 无效)

    我正在开发一个 Flask 服务器 用于通过网络在一些后端 Python 功能和 Javascript 客户端之间进行通信 我正在尝试利用 Flask 的session变量来存储用户在与应用程序交互过程中的特定数据 我已经删除了下面大部分应
  • PHP 会话锁定并使用 Memcache 存储会话

    我有一个标准的 html 页面 其中有一些 img 标签 每个标签都指向我们服务器上的一个 php 文件 加载 php 文件时 它会在生成图像之前将一些数据保存到会话中 来自每个脚本的会话中的数据随后将在我们的应用程序中的其他脚本中使用 生
  • 优雅地终止 WCF 服务 - 完成所有打开的会话并限制新会话

    我有一个我编写的 WCF 服务 它托管在 Windows 服务中 它以 PerSession 模式运行 该服务允许客户端通过该服务远程打开文件 更改文件以及关闭文件 到目前为止一切工作都非常顺利 当 Windows 服务停止时 我希望能够让
  • Codeigniter - 检查用户是否已登录并存在(它是真实用户)

    我正在尝试在用户登录我的网站时为他们设置会话数据 因此 如果用户存在于数据库中 我将设置一个会话数据 例如 this gt session gt set userdata user exists 1 现在 每次我想检查用户是否存在并已登录时
  • 会话过期后如何重定向到登录页面?

    我有三个 JSF 2 0 Web 模块 当会话过期时我需要重定向到登录页面 我已经尝试过使用HttpSessionListener 它正在调用sessionDestroyed 事件方法 但我无法在那里转发 重定向请求 我认为这是因为没有Ht

随机推荐

  • CF 940F Machine Learning

    传送门题目大意思路参考代码Remarks 传送门 题目大意 给你一个数组 a 1 n n 10 5 a 1 n
  • CF 976D Degree Set

    传送门题目大意思路参考代码总结 传送门 题目大意 给你一个长度为 n n 的正整数序列 d 1 d 2 d n d1 d2 dn xff08 d 1 lt d 2 lt lt d n
  • Luogu 3778 [APIO 2017] 商旅

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 看到这道题就想到了二分答案找负环 xff0c 但是怎么做呢 xff1f 完全不会 唉 xff0c 我太弱啦 xff01 先注意题目中说可以重复经过点和边 x
  • CF 963E Circles of Waiting

    传送门题目大意思路参考代码 传送门 题目大意 在平面直角坐标系上 xff0c 有一个神奇的点 xff0c 一开始在 0 0 0 0 每秒钟这个点都会随机移动 xff1a 如果它在 x y
  • CF 976F Minimal k-covering

    传送门题目大意 输入格式输出格式 思路参考代码 传送门 题目大意 给你一张二分图 G 61 U V E G 61 U V
  • CF 963A Alternating Sum

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 好不容易做得来一道题 xff0c 还是 A 题 xff08 所以不要瞧不起 A 题 xff09 xff0c 结果还写错了 xff08 不知道为什
  • iOS中瀑布流布局详解

    前段时间在逛淘宝的时候发现淘宝的商品界面的布局是瀑布流 我记得明明之前不是瀑布流的 x1f611 刚好手上活忙完了 xff0c 写了一个瀑布流的布局 xff0c 简单的封装了下 xff0c 以便日后使用 x1f60f 其实说到底瀑布流也就是
  • Luogu 2146 [NOI 2015] 软件包管理器

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 好不容易遇到一道傻逼题 xff0c 又出了个傻逼错误 xff0c 爆得只剩 30 30 分了 唉 xff0c 我太弱啦 xff01 显然 xff
  • Luogu 2150 [NOI 2015] 寿司晚宴

    传送门思路对于 30 30 30 的数据对于 100 100 100 的数据参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 完全做不来 xff0c 连暴力都打不来 主要好像是因为我从来没有做过以质因子为
  • Luogu 3649 [APIO 2014] 回文串

    传送门思路Manacher 算法 特殊字符回文半径算法与实现本质不同的回文串个数 正解参考代码总结 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 这道题各路神仙都说是模板题 xff0c 但我觉得完全不可做 xf
  • Luogu 2168 [NOI 2015] 荷马史诗

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 连哈夫曼树都不会 这道题就是一个 k k 叉哈夫曼树 题目要求满足两个条件 一是代价最小 二是最长长度最小 最长长度最小很好解决 只需要优先合并
  • Luogu 2178 [NOI 2015] 品酒大会

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 做了两个星期的题 xff0c 自己做出来的才只有这一道 xff0c 唉 xff0c 我太弱啦 xff01 我们考虑第一问怎么做 题目中相似的概念
  • Luogu 1117 [NOI 2016] 优秀的拆分

    传送门思路利用后缀数组解决重复子串问题注意事项参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 连暴力都想不到 xff0c 唉 xff0c 我太弱啦 xff01 考虑暴力法 xff0c 可以枚举一个中间点
  • Luogu 1712 [NOI 2016] 区间

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 这么个傻逼题 xff0c 居然把离散化写错了 xff0c 唉 xff0c 我太弱啦 xff01 显然我们可以考虑枚举最短长度和最长长度 xff0
  • CF 977F Consecutive Subsequence

    传送门思路参考代码 传送门 思路 CF 的第一场 div3 xff0c 在我提交了一份有错的代码后突然不能提交了 xff0c 在跑什么 System Testing xff0c 我就跟它杠上了 xff0c 直到它评测完 唉 xff0c 我太
  • CF 7D Palindrome Degree

    传送门思路参考代码 传送门 思路 不是马拉车加随便 DP 乱搞 xff1f 本来想复习一下马拉车的 xff0c 结果拉出了许多事端 xff08 修复了 OI Learner Judge 的严重 bug 一个害我调了两节课的 bug xff0
  • Luogu 3822 [NOI 2017] 整数

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 当年网同这道题还拿了 16 16 分 xff0c 现在一分都不会做了 xff0c 唉 xff0c 我太弱啦 xff01 这道题其实是很不错的 x
  • 【Go】go语言中切片的长度变化后容量的变化

    一 新增信息长度 43 当前长度 lt 61 当前容量 span class token keyword func span span class token function printSlice span span class toke
  • APIO 2018 Practice Session T1 Wedding cake

    没有传送门题目大意思路参考代码熟悉环境 没有传送门 题目大意 给你一个长度为 n n 的正整数序列 a i ai xff0c 要求构造出 n n 个小数 使得它们的和为 1 1 xff0c 且每个数小数点后恰好有
  • APIO 2018 Practice Session T3 / CF 936C Lock Puzzle

    传送门题目大意思路参考代码总结 传送门 题目大意 给你一个字符串 origin xff0c 一个字符串 target xff0c 长度均为 n n 要求在 3 n 3n xff08 5 2 n 5 2