• 【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 }
  • 相关阅读:
    XenServer 7 上Linux单用户模式下修改密码
    python pysnmp使用
    处理一则MySQL Slave环境出现ERROR 1201 (HY000): Could not initialize master info structure的案例。
    H3C交换机端口聚合
    H3C交换机密码策略
    使用Chrome远程调试GenyMotion上的WebView程序
    CefGlue在WinXP下闪退的排查方法
    Visual Studio 2015 开发Android Cordova出现unsupported major minor version 52.0错误的解决方法
    股票涨跌预测器
    javascript模块化编程-详解立即执行函数表达式IIFE
  • 原文地址:https://www.cnblogs.com/myx12345/p/11799045.html
Copyright © 2020-2023  润新知