前言

题目传送门

正解:模拟,递归。

考试的 T4,还是想复杂了 qwq。

这题不要用 STL,容易 \(\texttt{TLE}\)!!


题意简述

翻译够简了。

对了给一下样例解释的翻译:

第一个样例的第一组测试数据中,对于 \(a=aaba\) 和 \(b=abaa\),可以分成 \(a1=aa,a2=ba,b1=ab,b2=aa\);其中 \(a1\) 和 \(b2\) 全等。对于 \(a=ba\) 和 \(b=ab\),可以分成 \(a1=b,a2=a,b1=a,b2=b\);其中 \(a1\) 和 \(b2\) 全等,\(a2\) 和 \(b1\) 全等。所以 \(aaba\) 和 \(abaa\) 相似。

第一个样例的第二组测试数据中,\(aabb\) 和 \(abab\) 不满足相似。

第一个样例的第一组测试数据中,对于 $a=aaba$ 和 $b=abaa$,可以分成 $a1=aa,a2=ba,b1=ab,b2=aa$;其中 $a1$ 和 $b2$ 全等。对于 $a=ba$ 和 $b=ab$,可以分成 $a1=b,a2=a,b1=a,b2=b$;其中 $a1$ 和 $b2$ 全等,$a2$ 和 $b1$ 全等。所以 $aaba$ 和 $abaa$ 相似。

第一个样例的第二组测试数据中,$aabb$ 和 $abab$ 不满足相似。

分析

鉴于数据的特殊性 (简称水),我们可以直接按照题意递归即可。

因为输入的是两个字符串,而每次递归都需要两个新的字符串,而这两个新的字符串都是在以前的字符串上截取一段形成的。所以,我们根本不需要传字符串,只需要传在输入的字符串中截取的部分开始、结束的下标即可。

当然,因为每次判断都要传两个字符串,所以需要有两对参数,这里,\(l1,r1\) 代表第一个字符串(从输入的第一个字符串中截取),\(l2,r2\) 代表第二个字符串(从输入的第二个字符串中截取)。

首先,两个不同的判断条件打成两个函数 \(\operatorname{f1}\) 和 \(\operatorname{f2}\),分别判断奇数和偶数字符串长度的相似判定。

\(\operatorname{f1}\) 的实现是很简单的,只需要逐字判断是否相等即可。

不过需要注意细节,在计算字符串的长度时,不需要 \(+1\)。具体原因:本来计算长度的时候是要 \(+1\) 的,但是因为 \(l1\) 和 \(l2\) 已经提供了字符串开始的地方,所以我们在这两个数的基准上加的数就是从 \(0\sim r1-l1\) 共 \(r1-l1+1\) 个数字,就不需要 \(+1\) 了。

具体函数如下:

bool f1(int l1,int r1,int l2,int r2){
int t=r1-l1; //计算需要枚举判断的长度
for(int i=0;i<=t;i++) if(a[l1+i]!=b[l2+i]) return 0; //不一样直接返回
return 1; //所有的都一样
}

接着分析较难的递归函数 \(\operatorname{f2}\)。这个函数也是我们在主函数中调用的函数。

首先看传过来的字符串长度是奇数还是偶数。如果是奇数,直接返回 \(\operatorname{f1}\) 的判断就可以了。

如果是偶数,那么就需要判断一分为二之后是否相似。定义两个变量 \(mid1,mid2\) 分别表示两个字符串中间的下标,也就是分开的地方(注意这两个变量表示的是分开后前面那个字符串的最后一个元素),接着根据题意模拟即可,因为有两组配对,所以两组都要判断。注意先 &&||

这个地方容易打错,记得好好检查。

(对了提醒大家一定要记得不要把函数名给打掉了,我就是这么错的 qwq。)

\(\operatorname{f2}\) 的代码如下(别在意多余的空格,因为放一个框框里怕是有点不美观,我格式化了一下代码):

bool f2(int l1, int r1, int l2, int r2) {
if ((r1 - l1 + 1) & 1)
return f1(l1, r1, l2, r2);
int mid1 = (l1 + r1) >> 1, mid2 = (l2 + r2) >> 1;
return f2(l1, mid1, l2, mid2) && f2(mid1 + 1, r1, mid2 + 1, r2) ||
f2(l1, mid1, mid2 + 1, r2) && f2(mid1 + 1, r1, l2, mid2);
}

最后写好主函数,就可以把这道题切了 qwq。


不要做一些不道德的行为,洛谷的管理员会让你挂上牌子/xyx。

\(Code\)

//格式化了下代码哈
#include <bits/stdc++.h>
using namespace std;
char a[200005], b[200005];
int len;
bool f1(int l1, int r1, int l2, int r2) {
int t = r1 - l1;
for (int i = 0; i <= t; i++)
if (a[l1 + i] != b[l2 + i])
return 0;
return 1;
}
bool f2(int l1, int r1, int l2, int r2) {
if ((r1 - l1 + 1) & 1)
return f1(l1, r1, l2, r2);
int mid1 = (l1 + r1) >> 1, mid2 = (l2 + r2) >> 1;
return f2(l1, mid1, l2, mid2) && f2(mid1 + 1, r1, mid2 + 1, r2) ||
f2(l1, mid1, mid2 + 1, r2) && f2(mid1 + 1, r1, l2, mid2);
}
int main() {
scanf("%s %s", a + 1, b + 1);
len = strlen(b + 1);
if (f2(1, len, 1, len))
printf("YES\n");
else
printf("NO\n");
return 0;
}

写在最后

题目不难,细节有点 duliu。大家打代码一定一定要注意细节啊 awa。

CF559B Equivalent Strings TJ的更多相关文章

  1. Equivalent Strings

    Equivalent Strings 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/E 题意: 给出 ...

  2. Codeforces Round #313 (Div. 1) B. Equivalent Strings

    Equivalent Strings Problem's Link: http://codeforces.com/contest/559/problem/B Mean: 给定两个等长串s1,s2,判断 ...

  3. Codeforces Round #313 (Div. 2) D. Equivalent Strings

    D. Equivalent Strings Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/559/ ...

  4. Codeforces Round #313 (Div. 1) B. Equivalent Strings DFS暴力

    B. Equivalent Strings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/559 ...

  5. Equivalent Strings (字符串相等?)

    Equivalent Strings   E - 暴力求解.DFS Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I ...

  6. Codeforces 559B - Equivalent Strings

    559B - Equivalent Strings 思路:字符串处理,分治 不要用substr(),会超时 AC代码: #include<bits/stdc++.h> #include&l ...

  7. Codeforces Round #313 D. Equivalent Strings(DFS)

    D. Equivalent Strings time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  8. Codeforces Round #313 (Div. 2) 560D Equivalent Strings(dos)

    D. Equivalent Strings time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  9. 暴力求解——Equivalent Strings

    Submit Status Description Today on a lecture about strings Gerald learned a new definition of string ...

随机推荐

  1. Eureka中读写锁的奇思妙想,学废了吗?

    前言 很抱歉 好久没有更新文章了,最近的一篇原创还是在去年十月份,这个号确实荒废了好久,感激那些没有把我取消关注的小伙伴. 有读者朋友经常私信问我: "你号卖了?" "文 ...

  2. C#WebApi的创建与发布

    VS中新建项目-Web-ASP.NET Web应用程序 然后确定,选择空模版就可以了,勾上Webapi(也可以选择webapi模板,这样生成的文件比较多) 添加好之后Controllers和Model ...

  3. Vue实现点击复制文本内容(原生JS实现)

    需求: 实现点击订单编号复制内容 实现步骤: 这里我是在element 的table组件里实现的步骤,仅供参考,实际上实现思路都大同小异 首先在需要点击的地方,添加点击事件 <div class ...

  4. Redisson 分布式锁源码 02:看门狗

    前言 说起 Redisson,比较耳熟能详的就是这个看门狗(Watchdog)机制. 本文就一起看看加锁成功之后的看门狗(Watchdog)是如何实现的? 加锁成功 在前一篇文章中介绍了可重入锁加锁的 ...

  5. Unity接入ShareSDK实现QQ登录和QQ分享、微信分享

    原文链接:Unity接入ShareSDK实现QQ登录和QQ分享.微信分享 由于微信登录需要企业审核,我这里就不说明了,有需要的可以去官网看一下文档,和QQ登录比多了一个打包的步骤. 第一步:到官网申请 ...

  6. NUC980 运行 RT-Thread 驱动 SPI 接口 OLED 播放 badapple

    badapple 是什么,上网随便查了下,没看出个究竟,不过有个关于这个挺火的标签或者主题 < 有屏幕的地方就有 badapple >,网上有很多人用很多方式播放 badapple 动画, ...

  7. Gerrit+replication 同步Gitlab

    配置环境:gerrit 192.168.1.100gitlab 192.168.1.1011.创建秘钥 [root@gerrit ~]# ssh-keygen -m PEM -t rsa 2.添加ho ...

  8. 【玩转 WordPress】基于 Serverless 搭建个人博客图文教程,学生党首选!

    以下内容来自「玩转腾讯云」用户原创文章,已获得授权. 01. 什么是 Serverless? 1. Serverless 官方定义 Serverless 中的 Server是服务器的意思,less 是 ...

  9. 使用RSA和DES保护的Socket通信

    基本要求:将DES加密算法应用于网络通信,使用RSA算法自动分配密钥,设计好界面,可验证自动生成的密钥和加解密正确的结果. 具体实现要求:客户端和服务器建立连接后,客户端生成一个随机DES密钥;服务器 ...

  10. ACM金牌选手整理的【LeetCode刷题顺序】

    算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...