F. Equalizing Two Strings 題解(思維)
阿新 • • 發佈:2021-10-13
題目連結
題目思路
對於這種區間反轉問題,要把他想到是變為長度為2的區間反轉,類比於氣泡排序
因為所有的反轉都能用氣泡排序的思想實現
如果字元不同肯定不行
然後如果某個字元出現次數大於1的話肯定可以,因為可以一直拿著他動,去改變其他人
然後就是每個字元出現一次的情況,每次交換兩個相鄰的數就改變了逆序對的奇偶性
而兩個串同時改變奇偶性,所以要求兩個串的逆序對數量相同
程式碼
不擺爛了,寫題#include<bits/stdc++.h> #define fi first #define se second #define debug cout<<"I AM HERE"<<endl; using namespace std; typedef long long ll; const int maxn=2e5+5,inf=0x3f3f3f3f,mod=1e9+7; const double eps=1e-6; int n; char s[3][maxn]; int cnt[3][30]; signed main(){; int _;scanf("%d",&_); while(_--){ memset(cnt,0,sizeof(cnt)); scanf("%d %s %s",&n,s[1]+1 ,s[2]+1); for(int i=1;i<=n;i++){ cnt[1][s[1][i]-'a'+1]++; cnt[2][s[2][i]-'a'+1]++; } bool pr=1; bool flag=0; for(int i=1;i<=26;i++){ if(cnt[1][i]!=cnt[2][i]){ pr=0; break; } if(cnt[1][i]>=2){ flag=1; } } if(pr==0){ printf("No\n"); continue; } if(pr&&flag){ printf("Yes\n"); continue; } int sum[3]={0,0,0}; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ sum[1]+=(s[1][i]>s[1][j]); sum[2]+=(s[2][i]>s[2][j]); } } if(sum[1]%2!=sum[2]%2){ printf("No\n"); }else{ printf("Yes\n"); } } return 0; }