codeforces 1256f
题意
给出两个长度相等的字符串,每次操作必须同时翻转两个字符串中相同长度的子串,求是否可以通过这种操作使得两个串相等
题解
可以推出当两个字符串的字符集相等,任一字符出现的次数不为一时,答案为YES。因为我们可以不断地翻转两个的相同字符,同时令另一个字符串不断地交换字符使得两个字符串相等。
这样我们可以把n优化到26,然后暴力翻转相邻的两个数即可,当翻转次数为偶数时,输出YES。
#include <bits/stdc++.h>
using namespace std;
#define no printf("-1\n"),exit(0)
typedef long long ll;
typedef pair<int,int> P;
const int maxn=200050;
const int inf=0x3f3f3f3f;
const int mod=998244353;
char a[maxn],b[maxn];
int main()
{
int n,t,i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
scanf("%s %s",a,b);
vector<int> k1(30,0),k2(30,0);
for(i=0; i<n; i++)
{
int x=a[i]-'a',y=b[i]-'a';
k1[x]++,k2[y]++;
}
int f=0;
for(i=0; i<26; i++)
if(k1[i]!=k2[i])
f=1;
if(f)
{
printf("NO\n");
continue;
}
f=0;
for(i=0; i<26; i++)
if(k1[i]>1)
f=1;
if(f)
{
printf("YES\n");
continue;
}
int ans=0,l,r;
for(i=0;i<n;i++)
{
if(a[i]!=b[i])
{
for(j=i+1;j<n;j++)
if(b[j]==a[i])
break;
for(k=j-1;k>=i;k--)
swap(b[k],b[k+1]),ans++;
}
}
if(ans%2==0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}