题意:给定两个等长的字符串 s 和 t ,每次可以选择一个固定的长度 cnt,并在 s 和 t 中分别逆置一个长度为 cnt 的子串,问是否可以使 s 和 t 经过若干次操作之后相等。
分析:相等,那么 s 和 t 中每种字符的数量一定相等,所以这是第一个判断,然后,如果字符种类数量都等同,那么如果其中有个字符数量超过一个,那么就必用可以解,因为只要其中一个一直交换两个相同的字符,另一个在慢慢改变就可以了,除开这种情况,只有所有字符种类都只有一个的字符串了,它的长度不会超过26,这样就根据字典序统计它的交换次数,判断奇偶性是否一致就可以了。
代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int cs[26];
int ct[26];
int n;
int main()
{
int q;
string s,t;
cin>>q;
while(q--)
{
memset(cs,0,sizeof(cs));
memset(ct,0,sizeof(ct));
cin>>n>>s>>t;
for(int i=0;i<n;i++) cs[s[i]-'a']++,ct[t[i]-'a']++;
int ok=1,flag=0;
for(int i=0;i<26;i++)
{
if(cs[i]!=ct[i])
{
ok=0; break;
}
flag |= cs[i]>1;
}
if(!ok)
{
puts("NO");
continue;
}
if(flag)
{
puts("YES");
continue;
}
int cgs=0,cgt=0;
for(int i=1;i<n;i++)
for(int j=0;j<i;j++)
{
cgs+=(s[i]>s[j]);
cgt+=(t[i]>t[j]);
}
ok= (cgs%2)==(cgt%2);
if(ok) puts("YES");
else puts("NO");
}
}