首页 > 其他分享 >cf823div2C

cf823div2C

时间:2022-10-12 23:57:07浏览次数:81  
标签:int s2 s1 cf823div2C tepa tepb include

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

相关文章