D. Kill Anton 题解(思维构造)

题目链接

题目思路

还是要靠猜

结论就是相同的字符放在一起必定有一种答案最优不会证明

然后再用逆序对搞下即可

我的复杂度是\(O(24n)\)标程为\(O(n)\)

标程就是预处理了一下

代码

#include<bits/stdc++.h>
#define debug printf("\n I am here\n");
#define fi first
#define se second
#define pii pair<int,int>
typedef long long ll;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const ll INF=0x3f3f3f3f3f3f3f3f;
using namespace std;
int n;
char s[maxn];
char t[10],ans[10];
int pre[10];
int main(){
    int _;scanf("%d",&_);
    while(_--){
        ll rev=-1;
        scanf("%s",s+1);
        n=strlen(s+1);
        t[1]='A',t[2]='N',t[3]='O',t[4]='T';
        do{
            map<char,int> mp;
            for(int i=1;i<=4;i++){
                pre[i]=0;
                mp[t[i]]=i;
            }
            ll temp=0;
            for(int i=1;i<=n;i++){
                temp+=pre[mp[s[i]]+1];
                for(int j=1;j<=mp[s[i]];j++){
                    pre[j]++;
                }
            }
            if(temp>rev){
                rev=temp;
                for(int i=1;i<=4;i++){
                    ans[i]=t[i];
                }
            }
        }while(next_permutation(t+1,t+1+4));
        for(int i=1;i<=4;i++){
            for(int j=1;j<=n;j++){
                if(s[j]==ans[i]){
                    printf("%c",ans[i]);
                }
            }
        }
        printf("\n");
    }
    return 0;
}

posted @ 2021-06-04 16:33  hunxuewangzi  阅读(122)  评论(0编辑  收藏  举报