cf823div2C
题目
给你两个字符串\(s_1,s_2\).每次操作可以让\(s_1\)的前k个和\(s_2\)的后k个交换。询问是否可以通过多次上述操作,使得\(s_1=s_2\)。
思路
这种题通过观察,从变中发现不变的部分。可以发现,每次交换。
每个位置\(s1_{i}\)对应位\(s2_{n-i+1}\)是不变的。通过这个性质,我们可以知道对于每个这样的数对,我们必须找到另外一个相同的数对使得他们交叉匹配,才能使\(s1=s2\)有可能成立。对于\(n\)为偶数的情况。每种数对都必须是偶数个才能完全匹配。对于\(n\)为奇数,可以找到一个中间的一个来放奇数的数对,但是这个数对必须是相同字母组成的才可以。
代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm>
#define rep(i,l,n) for(int i=(l);i<=(n);++i)
#define ll long long
#define N 100005
using namespace std;
int t,n;
int a[200][200];
char s1[N],s2[N];
void solve()
{
scanf("%d",&n);
cin>>s1+1>>s2+1;
rep(i,1,n)
{
int j=n-i+1;
int tepa=s1[i],tepb=s2[j];
if(tepa>tepb)swap(tepa,tepb);
a[tepa][tepb]++;
}
int cnt=0;
for(int i='a';i<='z';++i)
{
cnt+=(a[i][i]&1);
for(int j=i+1;j<='z';++j)
{
if(a[i][j]&1)
{
printf("NO\n");
return;
}
}
}
if(((n&1)==0)&&cnt==0)printf("YES\n");
else if((n&1)&&cnt==1)printf("YES\n");
else cout<<"NO\n";
return;
}
int main()
{
cin>>t;
while(t--)
{
memset(a,0,sizeof(a));
solve();
}
system("pause");
return 0;
}
标签:int,s2,s1,cf823div2C,tepa,tepb,include
From: https://www.cnblogs.com/Vertrag/p/16786566.html