[atAGC055B]ABC Supremacy
将第$i$个字符在$A->C->B->A$这个环上操作$i$次,而此时的操作也即将$AAA,BBB$或$CCC$变为其中的另一个字符串
通过操作$XXXY->YYYY->YXXX$,即可以将$XXX$向右移动一位,同时其还可以变为任意字符,那么不妨将其删除并在最后(任意位置)插入一个形如$XXX$的字符串
具体的,令$f(S)$表示不断在$S$中删除形如$XXX$的字符串(直至不存在),则$f(S)$是良定义的
这里的良定义,即删除顺序不会影响$f(S)$($f(S)$是可确定的)
按$|S|$进行归纳,并对当前$S$分类讨论:
1.若$S$中不存在形如$XXX$的字符串,那么即可结束,显然有$f(S)=S$
2.若$S$中仅存在1个形如$XXX$的字符串,那么只能将其删除,则$f(S)=f(S')$
3.若$S$中存在不少于1个形如$XXX$的字符串,任取其中两个并记将两者删除后的字符串为$S_{1}$和$S_{2}$,那么证明$f(S_{1})=f(S_{2})$即可,下面对两者分类讨论:
(1)两者无公共部分,那么定义$S_{0}$为将两者均删除后的字符串,由归纳假设$f(S_{1})=f(S_{2})=f(S_{0})$,即得证
(2)两者有公共部分,那么不难发现最后剩下的均相同,也即有$S_{1}=S_{2}$,显然成立
进一步的,$S$能变为$T$当且仅当$f(S)=f(T)$
必要性:注意到$S$操作后(注意不是删除)$f(S)$不变(均先删除操作的部分即可)
充分性:先从$S$得到$f(S)$,再按$T$得到$f(T)$的逆序插入$XXX$也即可得到$T$(次数显然相同)
关于如何对于$S$求出$f(S)$,维护一个栈即可实现
时间复杂度为$o(n)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 500005
4 int n,ns,nt,a[N],b[N];
5 char s[N],t[N];
6 int main(){
7 scanf("%d%s%s",&n,s+1,t+1);
8 for(int i=1;i<=n;i++){
9 int x=(s[i]-'A'+n-i)%3;
10 if ((ns>1)&&(a[ns]==x)&&(a[ns-1]==x))ns-=2;
11 else a[++ns]=x;
12 }
13 for(int i=1;i<=n;i++){
14 int x=(t[i]-'A'+n-i)%3;
15 if ((nt>1)&&(b[nt]==x)&&(b[nt-1]==x))nt-=2;
16 else b[++nt]=x;
17 }
18 if (ns!=nt){
19 printf("NO\n");
20 return 0;
21 }
22 for(int i=1;i<=ns;i++)
23 if (a[i]!=b[i]){
24 printf("NO\n");
25 return 0;
26 }
27 printf("YES\n");
28 return 0;
29 }
[atAGC055B]ABC Supremacy的更多相关文章
- 【IOS】将一组包含中文的数据按照#ABC...Z✿分组
上一篇文章[IOS]模仿windowsphone列表索引控件YFMetroListBox里面 我们一步步的实现了WindowsPhone风格的索引. 但是有没有发现,如果你要实现按照字母排序,你还得自 ...
- 在JS中关于堆与栈的认识function abc(a){ a=100; } function abc2(arr){ arr[0]=0; }
平常我们的印象中堆与栈就是两种数据结构,栈就是先进后出:堆就是先进先出.下面我就常见的例子做分析: main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main( ...
- 学习Python的ABC模块(转)
http://yansu.org/2013/06/09/learn-Python-abc-module.html 1.abc模块作用 Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助a ...
- 将abc的全排列输出
#include "iostream" using namespace std; void swap(char a[],int i,int j){ char temp; temp= ...
- 关于String str =new String("abc")和 String str = "abc"的比较
String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...
- IE9 使用document.getElementsByName("abc") 不能获取到名称相同SPAN元素
<div name="abc"></div> <input name="abc" type="text" /& ...
- 经典String str = new String("abc")内存分配问题
出自:http://blog.csdn.net/ycwload/article/details/2650059 今天要找和存储管理相关的一些知识,网上搜了半天也没有找到完善的(30%的程度都不到),没 ...
- 再谈ABC
最近一直在看蒋老师那13篇<我的WCF之旅>,终于看完了,看得很慢,记得最初出来工作的时候那时的技术总监建议我去看的,可几个月前我才开始看,看了几个月才把13篇看完.第一篇WCF的博文是我 ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
随机推荐
- Java泛型中的细节
Java泛型中的细节 如果没有泛型 学习Java,必不可少的一个过程就是需要掌握泛型.泛型起源于JDK1.5,为什么我们要使用泛型呢?泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一 ...
- javascriptRemke之深入迭代
javascriptRemke之深入迭代 前言:"迭代"意为按照顺序反复多次执行一段程序,ECMAscript6中新增了两个高级特性:迭代器与生成器,使用这两个特性能更高效地实现迭 ...
- 前段---css
css主要是用来做如何显示html元素的 当浏览器读到一个样式表,它就会按照这个样式表来对文档做渲染 注意:每一个css样式表都是由两个部分组成的, 1,选择器 2,声明 声明又包括属性值和属性,每个 ...
- 洛谷3176 [HAOI2015]数字串拆分 (矩阵乘法+dp)
qwq真的是一道好题qwq自己做基本是必不可能做出来的. 首先,如果这个题目只是求一个\(f\)数组的话,那就是一道裸题. 首先,根据样例 根据题目描述,我们能发现其实同样数字的不同排列,也是属于不同 ...
- 一个小众搞笑的xss漏洞练习平台
XSS是当今网络安全事件中数量最多的攻击方式,虽然其危害性不高,但主要和其他攻击手段相结合,以实现一个复杂的攻击场景.那么,XSS是什么? XSS全称跨站脚本(Cross Site Scripting ...
- XSS_Labs靶场通关
XSS-labs靶场(1-20) 开始通关! 0x01 (直接漏洞注入) 反射型xss注入 1.遇到?name=text,尝试参数注入 注入语句: <script>alert('xss ...
- 记一次 .NET 某资讯论坛 CPU爆高分析
大概有11天没发文了,真的不是因为懒,本想前几天抽空写,不知道为啥最近求助的朋友比较多,一天都能拿到2-3个求助dump,晚上回来就是一顿分析,有点意思的是大多朋友自己都分析了几遍或者公司多年的牛皮藓 ...
- 使用jave2实现将wav格式的音频转换成mp3格式
最近需要用到语音合成功能,网上查阅了一番,发现可以使用腾讯云的语音合成API来完成这个功能,但是腾讯云的api返回的是wav格式的音频文件,这个格式的文件有些不通用,因此需要转换成mp3格式的文件. ...
- HDI PCB一阶和二阶和三阶如何区分??
一阶板,一次压合即成,可以想像成最普通的板二阶板,两次压合,以盲埋孔的八层板为例,先做2-7层的板,压好,这时候2-7的通孔埋孔已经做好了,再加1层和8层压上去,打1-8的通孔,做成整板.三阶板就 ...
- 《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历多选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的多选按钮进行实战. 2.d ...