【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\n");
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\n");
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\n");
96          else printf("NO\n");
97     }
98     return 0;
99 }

 

posted on 2019-11-05 15:57  myx12345  阅读(427)  评论(0编辑  收藏  举报

导航