将第$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的更多相关文章

  1. 【IOS】将一组包含中文的数据按照#ABC...Z✿分组

    上一篇文章[IOS]模仿windowsphone列表索引控件YFMetroListBox里面 我们一步步的实现了WindowsPhone风格的索引. 但是有没有发现,如果你要实现按照字母排序,你还得自 ...

  2. 在JS中关于堆与栈的认识function abc(a){ a=100; } function abc2(arr){ arr[0]=0; }

    平常我们的印象中堆与栈就是两种数据结构,栈就是先进后出:堆就是先进先出.下面我就常见的例子做分析: main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main( ...

  3. 学习Python的ABC模块(转)

    http://yansu.org/2013/06/09/learn-Python-abc-module.html 1.abc模块作用 Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助a ...

  4. 将abc的全排列输出

    #include "iostream" using namespace std; void swap(char a[],int i,int j){ char temp; temp= ...

  5. 关于String str =new String("abc")和 String str = "abc"的比较

    String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc&qu ...

  6. IE9 使用document.getElementsByName("abc") 不能获取到名称相同SPAN元素

    <div name="abc"></div> <input name="abc" type="text" /& ...

  7. 经典String str = new String("abc")内存分配问题

    出自:http://blog.csdn.net/ycwload/article/details/2650059 今天要找和存储管理相关的一些知识,网上搜了半天也没有找到完善的(30%的程度都不到),没 ...

  8. 再谈ABC

    最近一直在看蒋老师那13篇<我的WCF之旅>,终于看完了,看得很慢,记得最初出来工作的时候那时的技术总监建议我去看的,可几个月前我才开始看,看了几个月才把13篇看完.第一篇WCF的博文是我 ...

  9. Redis学习笔记之ABC

    Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...

随机推荐

  1. BurpSuite 功能概览

    简介 写作思想:相比较具体介绍某个功能的用法.会更加侧重于介绍 Burp 提供哪些功能.这样好处是在比较复杂的测试场景,如果Burp 刚好提供对应的功能,就不用花费精力造轮子了. 而需要掌握具体操作方 ...

  2. Python异常代码含义对照表

    Python常见的异常提示及含义对照表如下: 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是 ...

  3. 这几种Java异常处理方法,你会吗?

    摘要:我们在软件开发的过程中,任何语言的开发过程中都离不开异常处理. 本文分享自华为云社区<Java异常处理学习总结>,作者: zekelove . 我们在软件开发的过程中,任何语言的开发 ...

  4. Vulnstack内网靶场2

    环境配置 内网2靶场由三台机器构成:WIN7.2008 server.2012 server 其中2008做为对外的web机,win7作为个人主机可上网,2012作为域控 网络适配器已经设置好了不用自 ...

  5. PAT (Basic Level) Practice (中文)1026 程序运行时间 (15分)

    1026 程序运行时间 (15分) 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费 ...

  6. 远程设备管理opendx平台搭建-appium和adb的安装

    多年不见了,说起来也有3年了我又开始写博客了,这几年我还是没啥长进,还是干测试,但是测试行业的话,我已经成了一个测开了,也在搭建自己的测试网站 本系列文章讲述的是一个系列的第一部分,最终可以搭建一整套 ...

  7. 5个步骤,教你瞬间明白线程和线程安全.md

    记得刚来杭州面试的时候,有一家公司的技术总监问了我这样一个问题:你来说说有哪些线程安全的类?我心里一想,这我早都背好了,稀里哗啦说了一大堆. 他又接着问:那你再来说说什么是线程安全?--然后我就GG了 ...

  8. 剑指offer:JZ12 矩阵中的路径

    JZ12 矩阵中的路径 描述 请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上, ...

  9. 【Golang详解】go语言中并发安全和锁

    go语言中并发安全和锁 首先可以先看看这篇文章,对锁有些了解 [锁]详解区分 互斥锁.⾃旋锁.读写锁.乐观锁.悲观锁 Mutex-互斥锁 Mutex 的实现主要借助了 CAS 指令 + 自旋 + 信号 ...

  10. python write() argument must be str, not bytes

    python pickle from __future__ import absolute_import from __future__ import division from __future__ ...