Equalizing Two Strings
有几种情况可以直接判定结果:
① 字母对应个数不一样,可直接判NO② 当不满足①时,如果有一个字母有2个及以上的个数,也可直接判YES
③ 当不满足①②时我们可以知道,此时的字符串最多也只有26个字符,所以可以直接暴力,一个字符串只交换相邻位的字符必然可以变成另一个字符串,而如果交换次数为偶数,则为YES,否则为NO。
其实很多时候E、F题也并没有想象中的那么难,可以尝试尝试,至少赛时把题目看看也好。
代码:
// Created by CAD on 2019/11/7.
#include <bits/stdc++.h>
#define mst(name, value) memset(name,value,sizeof(name))
using namespace std;
const int maxn=2e5+5;
int cnt1[30],cnt2[30];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int q; cin>>q;
while(q--)
{
int n;
string s,t;
cin>>n>>s>>t;
mst(cnt1,0),mst(cnt2,0);
for(auto i:s)
cnt1[i-'a'+1]++;
for(auto i:t)
cnt2[i-'a'+1]++;
int flag=0;
for(int i=1;i<=26;++i)
if(cnt1[i]!=cnt2[i]) flag=1;
if(flag) {cout<<"NO"<<"\n";continue;}
for(int i=1;i<=26;++i)
if(cnt1[i]>1) flag=1;
if(flag) {cout<<"YES\n";continue;}
int cnt=0;
for(int i=0;i<n;++i)
if(s[i]!=t[i])
{
int x;
for(int j=i+1;j<n;++j)
if(s[j]==t[i])
{
x=j;
break;
}
for(int j=x;j>i;--j)
swap(s[j],s[j-1]),cnt++;
}
if(cnt%2==0) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042