• 【CF1256F】Equalizing Two Strings(逆序对)


    题意:给定两个长度均为n且由小写字母组成的字符串,可以进行若干次操作,每次从两个串中分别选一个长度相等的子串进行翻转,问是否存在能使两串相等的一系列操作方案

    n<=2e5

    思路:首先如果每种字母的个数不相同显然NO

    如果有某种字母出现超过两次显然YES,只要将两个字母移动到一起之后反复选择他便能无限次的无限制选择另一个串中长度为2的串进行交换,相当于冒泡排序

    对于剩余情况考虑逆序对的奇偶性,每一个长度超过2的操作都能表示为一系列长度=2的操作的集合

    冒泡排序每次能消除一个逆序对,如果两者逆序奇偶性相同只要小的那个在冒泡排序完成之后不断浪费次数即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 typedef unsigned int uint;
     5 typedef unsigned long long ull;
     6 typedef long double ld;
     7 typedef pair<int,int> PII;
     8 typedef pair<ll,ll> Pll;
     9 typedef vector<int> VI;
    10 typedef vector<PII> VII;
    11 typedef pair<ll,ll>P;
    12 #define N  200010
    13 #define M  1000000
    14 #define INF 1e9
    15 #define fi first
    16 #define se second
    17 #define MP make_pair
    18 #define pb push_back
    19 #define pi acos(-1)
    20 #define mem(a,b) memset(a,b,sizeof(a))
    21 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
    22 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
    23 #define lowbit(x) x&(-x)
    24 #define Rand (rand()*(1<<16)+rand())
    25 #define id(x) ((x)<=B?(x):m-n/(x)+1)
    26 #define ls p<<1
    27 #define rs p<<1|1
    28 #define fors(i) for(auto i:e[x]) if(i!=p)
    29 
    30 const int MOD=1e9+7,inv2=(MOD+1)/2;
    31       double eps=1e-6;
    32       int dx[4]={-1,1,0,0};
    33       int dy[4]={0,0,-1,1};
    34 
    35 char a[N],b[N];
    36 int s1[N],s2[N];
    37 
    38 int read()
    39 {
    40    int v=0,f=1;
    41    char c=getchar();
    42    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
    43    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
    44    return v*f;
    45 }
    46 
    47 ll readll()
    48 {
    49    ll v=0,f=1;
    50    char c=getchar();
    51    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
    52    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
    53    return v*f;
    54 }
    55 
    56 int main()
    57 {
    58     int cas=read();
    59     while(cas--)
    60     {
    61         int n=read();
    62         rep(i,0,25) s1[i]=s2[i]=0;
    63         scanf("%s",a+1);
    64         scanf("%s",b+1);
    65         rep(i,1,n)
    66         {
    67             s1[a[i]-'a']++;
    68             s2[b[i]-'a']++;
    69         }
    70         int flag=1;
    71         rep(i,0,25)
    72          if(s1[i]!=s2[i]){flag=0; break;}
    73         if(!flag)
    74         {
    75             printf("NO
    ");
    76             continue;
    77         }
    78         flag=0;
    79         rep(i,0,25)
    80          if(s1[i]>=2){flag=1; break;}
    81         if(flag)
    82         {
    83             printf("YES
    ");
    84             continue;
    85         }
    86         int t1=0,t2=0;
    87         rep(i,0,25) s1[i]=s2[i]=0;
    88         rep(i,1,n)
    89         {
    90             int x=a[i]-'a',y=b[i]-'a';
    91             rep(j,x+1,25) t1=(t1+s1[j])%2;
    92             rep(j,y+1,25) t2=(t2+s2[j])%2;
    93             s1[x]++; s2[y]++;
    94         }
    95         if(t1==t2) printf("YES
    ");
    96          else printf("NO
    ");
    97     }
    98     return 0;
    99 }
  • 相关阅读:
    进度条简单实现
    bootstrap学习(二)-----Modal模态框
    PL/SQL Developer登入时候报ORA-12638: 身份证明检索失败的解决办法
    pdf.js在IIS中配置使用笔记
    JSON数据查询方法
    Visual Studio 2013 错误提示“未找到与约束匹配”的修正
    WebStorm 11激活方法
    Xamarin开发Android笔记:使用ZXing进行连续扫描
    Xamarin开发IOS笔记:切换输入法时输入框被遮住
    Xamarin开发Android笔记:拍照或相册选取图片角度问题
  • 原文地址:https://www.cnblogs.com/myx12345/p/11799045.html
Copyright © 2020-2023  润新知