Codeforces Round #723 (Div. 2) D. Kill Anton (字符串构造,全排列)

Posted Accelerator

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #723 (Div. 2) D. Kill Anton (字符串构造,全排列)相关的知识,希望对你有一定的参考价值。

  • 题意:有一字符串,可以将其任意排序,构造完后可以相邻字符两两交换位置,花费为\\(1\\),构造一个复原成原串花费最多的串。

  • 题解:感觉还是不好证明啊,结论就是相同的字符连续在一起一定最优,因为最多只有\\(4\\)个字符,所以我们可以全排列,花费就是相对于原串的逆序对数,这里官方题解给的暴力求逆序对的方法感觉很巧妙,可以记一下。

  • 代码

    #include <bits/stdc++.h>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    #define rep(a,b,c) for(int a=b;a<=c;++a)
    #define per(a,b,c) for(int a=b;a>=c;--a)
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
    ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
    ll lcm(ll a,ll b) {return a/gcd(a,b)*b;}
     
    map<char,int> mp;
    int cnt[4];
    ll res[4][4];
    char ss[4]={\'A\',\'N\',\'O\',\'T\'};
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    	mp[\'A\']=0,mp[\'N\']=1,mp[\'O\']=2,mp[\'T\']=3;
    	int _;
    	cin>>_;
    	while(_--){
    		for(int i=0;i<4;++i){
    			cnt[i]=0;
    		}
    		me(res,0,sizeof(res));
    		string s;
    		cin>>s;
    		int n=(int)s.size();
     
    		for(auto w:s){
    			cnt[mp[w]]++;
    		}
     
    		for(int i=0;i<4;++i){
    			int cur=0;
    			for(int j=0;j<n;++j){
    				res[i][mp[s[j]]]+=cur;
    				if(mp[s[j]]==i) cur++;
    			}
    		}
     
    		ll mx=-1;
    		vector<int> ans;
    		vector<int> v={0,1,2,3};
     
    		do{
    			ll cur=0;
    			for(int i=0;i<4;++i){
    				for(int j=i+1;j<4;++j){
    					cur+=res[v[j]][v[i]];	
    				}
    			}
    			if(cur>mx){
    				mx=cur;
    				ans=v;
    			}
    		}while(next_permutation(v.begin(),v.end()));
    		for(auto w:ans){
    			for(int i=1;i<=cnt[w];++i){
    				cout<<ss[w];
    			}
    		}
    		cout<<\'\\n\';	
    	}
    	
        return 0;
    }
    

以上是关于Codeforces Round #723 (Div. 2) D. Kill Anton (字符串构造,全排列)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #723 (Div. 2)Codeforces-1526ABCD

Codeforces Round #723 (Div. 2)Codeforces-1526ABCD

Codeforces Round #723 (Div. 2)

Codeforces Round #723 (Div. 2), A. Mean Inequality

Codeforces Round #723 (Div. 2)B. I Hate 1111

Codeforces Round #723 (Div. 2)