Codeforces Round #598 (Div. 3)

传送门
F:Equalizing Two Strings(我见过最水的F)
题意:给你两个字符串S,T 你可以反转两个串的任意区间,任意次数,前提是两个串的翻转次数相同,每次反转区间的长度相同。问你能不能是这两个串相等
思路:首先两个串的不同字母的数量必须相等,
然后因为可以反转任意次,那么其实只要这两个串中有一个串是出现重复字母的 就一定能使这两个串相等(就相当于你一直翻转这俩重复的字母,然后去操作另一个串,
使他俩相等)

如果字母构成相同,并且没有重复字母。在s中选择一个len = 2的区间,再在t中选择一个len = 2的区间,就相当于在t中选择两个len = 2的区间。
那么只要t能在偶数次len = 2的操作中得到s,就可行,否则就不可行。n^2模拟一下就可以

#include<bits/stdc++.h>
using namespace std;
typedef long long L;

char s1[200010];
char s2[200010];
int n1[50];
int n2[50];


int main()
{
     int q;
     scanf("%d",&q);
     while(q--){
        int n,f=0;scanf("%d %s %s",&n,s1+1,s2+1);
        for(int i=0;i<26;i++) n1[i]=0,n2[i]=0;
        for(int i=1;i<=n;i++){
            n1[s1[i]-'a']++;
            n2[s2[i]-'a']++;
        }
        for(int i=0;i<26;i++){
            if(n1[i]!=n2[i]){//cout<<i<<endl;
           // cout<<n1[i]<<","<<n2[i]<<endl;
                f=1;puts("NO");break;
            }
        }
        if(f) continue;

        for(int i=0;i<26;i++){
            if(n1[i]>1||n2[i]>1){f=1;break;}
        }
        if(f){puts("YES");continue;}

        int ans=0;
        for(int i=1;i<n;i++){
            for(int j=i;j<=n;j++){
                if(s2[i]==s1[j]){
                     for(int k=j;k>i;k--){
                        ans++;
                        swap(s1[k],s1[k-1]);
                     }
                     break;
                }
            }
        }
        if(ans&1) puts("NO");
        else puts("YES");

     }
}


E Yet Another Division Into Teams
简单dp模拟一下就好了,就是太麻烦了

全部评论

相关推荐

01-02 21:17
已编辑
西安理工大学 后端
程序员小白条:项目不太重要,你的优势的算法竞赛,然后多背相关的八股文,项目可以不作为重点考虑,面试可能就简单带过项目就行了,你可以直接写简历,背项目相关的八股文就行,也不用自己做,时间紧张的情况下,性价比最高
点赞 评论 收藏
分享
牛客611297800号:下去沉淀沉淀吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务