传送门

文章目录

  • 题意:
  • 思路:

题意:

给你两个长度为nnn的串a,ba,ba,b,每次可以同时翻转a,ba,ba,b中任意一段长度为L(1≤L≤n)L(1\le L\le n)L(1≤L≤n)的子串,问能否通过若干次操作使两个串相同。

思路:

首先他们包含的字符个数不同的话肯定是不能转换成相同的串的。
否则的话,通过观察,有个显然的结论:如果某个串有两个相同的字符,那么可以证明两个串一定可以变成一样的。
这个结论比较显然,我们先通过交换使两个相同字符相邻,让后再每次交换长度为222的字串的时候选择这个相邻的字符,这样这个串是不变的,而上面哪个串一定可以通过交换相邻位置的操作变成下面哪个串,所以是正确的。
那么当串中没有相同的字母的时候怎么办呢?我们还是考虑交换相邻两项,交换相邻两项?可以联想到逆序对,那么我们求出来两个串的逆序对个数,也就是将两个串排序之后的操作次数,如果两个串逆序对个数同奇偶,那么一定可以变成一样的。这个也比较显然,当某个串排序完成之后,可以交换相邻两项偶数次,这样相当于没有变化,一直到另一个串也排好序为止。

// Problem: F. Equalizing Two Strings
// Contest: Codeforces - Codeforces Round #598 (Div. 3)
// URL: https://codeforces.com/contest/1256/problem/F
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
char a[N],b[N];
int c1[26],c2[26];bool check() {memset(c1,0,sizeof(c1));memset(c2,0,sizeof(c2));bool flag=false;for(int i=1;i<=n;i++) {c1[a[i]-'a']++; c2[b[i]-'a']++;}for(int i=0;i<26;i++) {if(c1[i]!=c2[i]) return false;if(c1[i]>1||c2[i]>1) flag=1;}if(flag) return true;LL sum1,sum2; sum1=sum2=0;memset(c1,0,sizeof(c1));memset(c2,0,sizeof(c2));for(int i=1;i<=n;i++) {c1[a[i]-'a']++; c2[b[i]-'a']++;for(int j=a[i]-'a'+1;j<26;j++) sum1+=c1[j];for(int j=b[i]-'a'+1;j<26;j++) sum2+=c2[j];}if(sum1-sum2&1) return false;return true;
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);int _; scanf("%d",&_);while(_--) {scanf("%d%s%s",&n,a+1,b+1);puts(check()? "YES":"NO");}return 0;
}
/**/

Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 思维 + 逆序对相关推荐

  1. Codeforces Round #726 (Div. 2) F. Figure Fixing 二分图 + 思维

    传送门 文章目录 题意: 思路 题意: 给你一张nnn个点mmm条边的图,每个点都有一个当前值aia_iai​,目标值bib_ibi​,每次可以选择一条边(i,j)(i,j)(i,j),将ai,aja ...

  2. Codeforces Round #585 (Div. 2) E. Marbles 状压dp + 逆序对

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑数列最终的状态一定是相同颜色在一起,所以我们发现他的颜色是有顺序的!显然可以用状压dpdpdp来枚举颜色的顺序,但是又有问题了,你怎么确定当前这个 ...

  3. Codeforces Round #712 (Div. 2) F. Flip the Cards 思维 + 贪心

    传送门 文章目录 题意: 思路: 题意: 给你nnn张卡片,每张卡片正面写有数字aaa,反面写有数字bbb,[1,2∗n][1,2*n][1,2∗n]之间的整数在这些数字中都恰好出现一次,我们认为这n ...

  4. Codeforces Round #694 (Div. 2) F. Strange Housing (贪心思维)

    F. Strange Housing 题意 有 nnn 个点和 mmm 条边,对点进行染色.要求一条边的两个点不能都染色,并且删除两端都没有染色的边之后,图连通.请给出一种染色方案. 题解 暴力贪心即 ...

  5. Codeforces Round #506 (Div. 3) - F. Multicolored Markers (思维)

    题意 给两种颜色的数量 a 和 b,这两种颜色恰好组成一个长方形,而且至少有一种颜色在整个长方形里面也是个长方形,求满足条件中周长最小的情况 AC 当a是里面的小长方形,把a能组成的长方形的宽记录一下 ...

  6. Codeforces Round #598 (Div. 3) E. Yet Another Division Into Teams dp + 输出方案

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,你需要将其分成若干组,每组的价值为max⁡(ai)−min(ai)\max(a_i)-min(a_i)max(ai​)−mi ...

  7. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

  8. Codeforces Round #644 (Div. 3) F.Spy-string

    Codeforces Round #644 (Div. 3) F.Spy-string 题目链接 You are given n strings a1,a2,-,an: all of them hav ...

  9. Codeforces Round #849 (Div. 4) F. Range Update Point Query

    Codeforces Round #849 (Div. 4) F. Range Update Point Query 题目大意: 给一串数字,有两个操作: 操作1:将 l − r l-r l−r 的数 ...

最新文章

  1. 散列表查找(哈希表)
  2. 中国计算机学会CCF推荐国际学术会议和期刊目录-计算机科学理论
  3. Javaweb 项目内所有页面都是404问题
  4. ASP实例:利用缓存提高数据显示效率
  5. datagrid后台分页js.js
  6. element-ui中el-drawer组件打开自动聚焦问题
  7. php检测表大小,查询mysql数据库、表的大小
  8. 设计模式7大结构型模式
  9. double key map 的实现
  10. WLAN射频、信道与帧分类
  11. Js中对URL进行转码与解码
  12. 三年级计算机 键盘指法 教案,人教版三年级信息技术《第一课 键盘操作再加强》教案(精品获奖)...
  13. Git 操作实战示例
  14. Show一下2008新技术体验活动的奖品
  15. 伪类如何动态在html设置样式,VUE项目中对伪类动态设置样式
  16. 计算机图形学 dda,计算机图形DDA算法
  17. python 3.7 安装 win32 win32com win32ras模块
  18. MATLAB读取gdas1气象数据,HYSPLIT模式简介及单机版使用图文教程
  19. 脸部识别是根据什么识别的_我们需要知道面部识别失败的频率
  20. Speedoffice (word)文档里面怎样自动生成目录

热门文章

  1. 老婆晚上不想睡?这个操作你要会!
  2. 别太贪婪,这些技能能让你一辈子满足
  3. 神还原女神照片!GAN为百年旧照上色
  4. 有哪些经济学理论可以用在谈恋爱上?
  5. php验证手机验证码过期,验证过期时间
  6. linux at java,Linux-Tutorial/Java-bin.md at master · linsanityHuang/Linux-Tutorial · GitHub
  7. 10以内的分解与组成怎么教_狗狗酷炫的飞盘游戏怎么玩?分解步骤教你快速学会...
  8. 高德面试官问我:JVM内存溢出后服务还能运行吗,我一顿操作行云流水
  9. html图片宽度高度等比例绽放,css图片自动绽放大小,左右,上下居中
  10. 查看服务器物理内存大小,如何看服务器的物理内存大小