CodeForces 600C【构造】

题意:
在原字符串中修改数量最少,然后保证最小字典序。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
int a[100];
char s[N];
char ans[N];
int main()
{
    scanf("%s",s);
    int len=strlen(s);
    memset(a,0,sizeof(a));
    if(len%2==0)
    {
        for(int i=0;i<len;i++)
        {
            int x=s[i]-'a';
            a[x]++;
        }
        for(int i=0;i<26;i++)
        {
            if(a[i]%2)
            {
                for(int j=25;j>i;j--)
                {
                    if(a[j]%2)
                    {
                        a[j]--;
                        a[i]++;
                        break;
                    }
                }
            }
        }
        int s=0;
        int t=len-1;
        for(int i=0;i<26;i++)
        {
            if(a[i]&&a[i]%2==0)
            {
                while(a[i])
                {
                    ans[s++]=i+'a';
                    ans[t--]=i+'a';
                    a[i]-=2;
                }
            }
        }
        ans[len]='';
        printf("%s
",ans);
    }
    else
    {
        for(int i=0;i<len;i++)
        {
            int x=s[i]-'a';
            a[x]++;
        }
        for(int i=0;i<26;i++)
        {
            if(a[i]%2!=0)
            {
                for(int j=25;j>i;j--)
                {
                    if(a[j]&&a[j]%2!=0)
                    {
                        a[j]--;
                        a[i]++;
                        break;
                    }
                }
            }
        }
        int s=0;
        int t=len-1;
        for(int i=0;i<26;i++)
        {
            if(a[i]&&a[i]%2==0)
            {
                while(a[i]>0)
                {
                    a[i]-=2;
                    ans[s++]=i+'a';
                    ans[t--]=i+'a';
                }
            }
            if(a[i]&&a[i]%2!=0)
            {
                while(a[i]>1)
                {
                    a[i]-=2;
                    ans[s++]=i+'a';
                    ans[t--]=i+'a';
                }
                ans[len/2]=i+'a';
            }
        }
        ans[len]='';
        printf("%s
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934762.html