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 变成开头、原来做好的部分变成结尾;
4:原来做好的部分拼到 x 前面;
5:新的做好的部分变成后缀。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,K=;
int n,m,ct[K];
char a[N],b[N];
void Rv(int l,int r)
{
for(int i=l,j=r;i<j;i++,j--)
swap(a[i],a[j]);
}
void To_tail(int x)
{
char w=a[x];
for(int i=x;i<n;i++)a[i]=a[i+];
a[n]=w;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",a+); scanf("%s",b+);
for(int i=;i<=n;i++)
ct[a[i]-'a']++;
for(int i=;i<=n;i++)
ct[b[i]-'a']--;
for(int i=;i<K;i++)
if(ct[i]!=){puts("-1");return ;}
if(m<*(n-)+){puts("-1");return ;}
printf("%d\n",*(n-)+*(b[]!=a[n]));//not +2!!!
int len=;
if(b[]!=a[n])
{
for(int i=;i<=n;i++)
if(a[i]==b[]){len=i-;break;}
printf("%d %d ",n-len,len);
Rv(,len); Rv(len+,n);
}
for(int l2=,ps=;l2<n;l2++,ps++)
{
for(int i=;i<=n;i++)
if(a[i]==b[ps]){len=i-;break;}
printf("%d %d %d %d %d ",n-len,len,
n-len-l2,l2,n-l2-);
Rv(len+,n-l2); To_tail(n-l2);
}
puts(""); return ;
}
刚才写着题解,忽然发现可以随随便便变成 3*n 的嘛!
1.n-len-1,使得 x 变成结尾,并且原来做好的部分倒序变成开头;
2.1,使 x 接在最前面;
3.n,整体翻转,就变成正序的“原来做好的部分”后面添了一个 x 了!
题解是 2.5*n 的。考虑做好的部分允许在过程中变成倒序的,然后一次5个操作往上添2个字符。
设现在 A 串的后缀是 B 串的 [ L , R ] 部分。考虑扩充成 [ L-1 , R+1 ] 。设 y 是要往 A 的最后面放的、 x 是要往“已经做好的部分”的前面放的。
1.把 x 露出来(放到结尾),此时原来做好的部分倒序在开头;
2.翻转整个序列,现在原来部分正序在结尾, x 在开头;
这一步很巧妙!这样可以让再做一步之后,原来部分的另一端露在开头;
3.原来部分接在最前面;此时原来部分是倒序;
4.找到 y 的位置,操作含 y 的对应后缀,这样 y 接在了“倒序的原来部分”的前面,并且整个部分在序列里面;
这一步的思想很大胆!允许做好的部分埋在序列中部;
5.操作后缀,使得做好的部分成为后缀;此时的做好部分是翻转过的状态,即原来按顺序对应的是 [ L , R ] 的话,现在是 [ R , L ] 。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,K=;
int n,m,ct[K],p[M],tot;
char a[N],b[N],c[N];
void cz(int x)
{
for(int i=n-x+,j=x;i<=n;i++,j--)
c[j]=a[i];
for(int j=x+,i=;j<=n;i++,j++)
c[j]=a[i];
memcpy(a,c,sizeof c); p[++tot]=x;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",a+); scanf("%s",b+);
for(int i=;i<=n;i++)
ct[a[i]-'a']++;
for(int i=;i<=n;i++)
ct[b[i]-'a']--;
for(int i=;i<K;i++)
if(ct[i]!=){puts("-1");return ;}
int l,r,x,y; l=r=(n+)>>;
if(a[n]!=b[l])
{
for(int i=;i<=n;i++)
if(a[i]==b[l]){x=i;break;}
cz(n-x);
}
bool fx=;
for(l--,r++;l>=;l--,r++)
{
for(int i=;i<=n;i++)
if(a[i]==b[l]){x=i;break;}
for(int i=;i<=n;i++)
if(a[i]==b[r]&&i!=x){y=i;break;}
if(fx)swap(x,y); fx=!fx; char tp=a[y];
cz(n-x); cz(n); cz(r-l-);
for(int i=r-l+;i<=n;i++)
if(a[i]==tp){y=i;break;}
int tmp=n-y; cz(n-y+); cz(n-tmp-(r-l+));
}
if((n&)==&&!fx){ cz(n-); cz(); fx=!fx;}
if(fx)cz(n);
printf("%d\n",tot);
for(int i=;i<=tot;i++)printf("%d ",p[i]);puts("");
return ;
}
CF 936C Lock Puzzle——构造的更多相关文章
- CF936C Lock Puzzle 构造
传送门 好久不做构造题脑子都僵化了qwq 无解的条件是\(s\)包含的字符可重集和\(t\)包含的字符可重集不相等,相等的时候下文会给出一种一定可行的构造方案. 考虑增量构造.定义某个字符串\(x\) ...
- 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/O ...
- HDU 4708:Rotation Lock Puzzle
Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu4708 Rotation Lock Puzzle
Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Codeforces Round #467 (Div. 2) E -Lock Puzzle
Lock Puzzle 题目大意:给你两个字符串一个s,一个t,长度<=2000,要求你进行小于等于6100次的shift操作,将s变成t, shift(x)表示将字符串的最后x个字符翻转后放到 ...
- HDU 4708 Rotation Lock Puzzle (简单题)
Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDUOJ---(4708)Rotation Lock Puzzle
Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- Lock Puzzle CodeForces - 936C (构造)
大意: 给定字符串$s$,$t$, 每次操作可以将$S=AB$变为$S=B^RA$, 要求$3n$次操作内将$s$变为$t$. #include <iostream> #include & ...
- Rotation Lock Puzzle
Problem Description Alice was felling into a cave. She found a strange door with a number square mat ...
随机推荐
- vm虚拟机用批处理启动和关闭
title vmware 虚拟机开启中 cls&&echo 正在开启VMware虚拟机,请稍候... "D:\vmware\vmware.exe" -x " ...
- OAuth 2.0 综述
OAuth 2.0 rfc6749 规范 OAuth 2.0 rfc6749 规范-带目录,阅读 RFC 文档的 工具 OAuth 官网 OAuth2 核心 角色 Token 类型 access to ...
- 利用三层交换机实现VLAN间路由(计算机网络中速率、带宽、吞吐量的概念)
1.速率 速率是指计算机网络中的主机在数字信道上,单位时间内从一端传送到另一端的数据量,即数据传输率,也称数据率或比特率.比特(bit)是数据量的最小单位,s(秒)是时间的最小单位.所以速率单位为bi ...
- jQuery基础--插件
1. 插件 1.1. 常用插件 插件:jquery不可能包含所有的功能,我们可以通过插件扩展jquery的功能. jQuery有着丰富的插件,使用这些插件能给jQuery提供一些额外的功能. 1.1. ...
- each of which 用法
each of which 在以下為 同位語,非關代. 1. An urn contains two balls, each of which is known to be either white ...
- Zookeeper之启动常见错误及解决方法
Zookeeper启动后,有时候没有真正的启动,那我们如何查找错误呢,就可以查看zookeeper目录下面的zookeeper.out文件,就可以查看到错误了.zookeeper.out文件比较的重要 ...
- Fiddler查看IP和响应时间
原文:Fiddler查看IP和响应时间 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/si ...
- 工作流引擎 springmvc SSM 流程审批 Java Activiti 后台框架源码
工作流模块 1.模型管理 :web在线流程设计器.预览流程xml.导出xml.部署流程 2.流程管理 :导入导出流程资源文件.查看流程图.根据流程实例反射出流程模型.激活挂起 3.运行中 ...
- VUE小案例--跑马灯效果
自学Vue课程中学到的一个小案例,跑马灯效果 <!DOCTYPE html> <html lang="zh-CN"> <head> <me ...
- 【知识强化】第三章 存储系统 3.5 双口RAM和多模块存储器
下面我们进入双端口RAM和多模块存储器的学习.这是提高我们的存储器的访存速度的一些措施. 我们之前已经讲过我们的主存和CPU是进行连接的,那么这就导致了一个问题就是说,随着我们现代科技的发展,计算机的 ...