F. Equalizing Two Strings 题解(思维)
题目链接
题目思路
对于这种区间反转问题,要把他想到是变为长度为2的区间反转,类比于冒泡排序
因为所有的反转都能用冒泡排序的思想实现
如果字符不同肯定不行
然后如果某个字符出现次数大于1的话肯定可以,因为可以一直拿着他动,去改变其他人
然后就是每个字符出现一次的情况,每次交换两个相邻的数就改变了逆序对的奇偶性
而两个串同时改变奇偶性,所以要求两个串的逆序对数量相同
代码
#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-6;
int n;
char s[3][maxn];
int cnt[3][30];
signed main(){;
int _;scanf("%d",&_);
while(_--){
memset(cnt,0,sizeof(cnt));
scanf("%d %s %s",&n,s[1]+1 ,s[2]+1);
for(int i=1;i<=n;i++){
cnt[1][s[1][i]-'a'+1]++;
cnt[2][s[2][i]-'a'+1]++;
}
bool pr=1;
bool flag=0;
for(int i=1;i<=26;i++){
if(cnt[1][i]!=cnt[2][i]){
pr=0;
break;
}
if(cnt[1][i]>=2){
flag=1;
}
}
if(pr==0){
printf("No\n");
continue;
}
if(pr&&flag){
printf("Yes\n");
continue;
}
int sum[3]={0,0,0};
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
sum[1]+=(s[1][i]>s[1][j]);
sum[2]+=(s[2][i]>s[2][j]);
}
}
if(sum[1]%2!=sum[2]%2){
printf("No\n");
}else{
printf("Yes\n");
}
}
return 0;
}
不摆烂了,写题