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