1. 程式人生 > 其它 >F. Equalizing Two Strings 題解(思維)

F. Equalizing Two Strings 題解(思維)

題目連結

題目思路

對於這種區間反轉問題,要把他想到是變為長度為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;
}


不擺爛了,寫題