CodeForces 600C--思考

トピックリンク:https://vjudge.net/problem/127221/origin

それは右へ、右から左へ、左から同じことを読み込む場合は、文字列が回文と呼ばれています。たとえば、「カザフ」、「OO」、「R」と「mikhailrubinchikkihcniburliahkimは」palindromsですが、「文字列と」ABB「ijは」ではありません。

あなたは、文字列与えられている  のは、  小文字のラテン文字からなります。一度、あなたは他の小文字の文字にその位置にある文字列と変更文字の任意の位置を選択することができます。したがって、各文字列の長さを変更した後に変更されません。最初にあなたがでいくつかの文字に変更することができます  あなたが好きな、あなたは文字の順番を並べ替えることができます。順列は、変更としてカウントされません。

あなたは、変更の最小数で回文を取得する必要があります。あなたは辞書順(アルファベット順)最小の回文を取得する必要があることを行うには、いくつかの方法がある場合。だから、まずあなたは、変更の数を最小限に抑える必要があり、その後、辞書的に回文を最小限に抑えます。

入力

唯一のラインが含まれた文字列  S  (1≤| S |≤2・10 5)のみラテン小文字からなります。

出力

変化の最小数を得ることができる辞書順最小の回文を印刷します。

入力
AABC
出力
アバ
入力
aabcd
出力
ABCBA 

タイトルの意味:あなたは文字列の文字に最小限の変更であるべき文字列を、与えるために(すなわち、選択された文字が他の文字に置き換え)、彼は文字列の辞書の後に得られた最小の回文配列を並べ替える作ります。
アイデア:1.まず、文字列内の文字の出現回数を数えます。
2.必要な場合は、大きな奇数文字のASCII値がより小さいASCII値となり、奇数の文字を表示されるように表示され、二つのそのような文字でも何度か登場しています。
3.最後に、配列の最終的な出力のような法則に従います。
次のようにACコードは次のとおりです。
書式#include <cstdioを> 
する#include < 文字列の.h>
 使用して 名前空間はstdを、
typedefの長い 長いLL。
constの ダブル EPS = 1E- 6 const  int型 INF = 2E9;
constの LL LNF = 9e18。
const  int型 MOD = 1E9 + 7 const  int型 MAXN = 2E5 + 10 

INT和[ 30 ]においてlen;
チャーS [MAXN]。

のinit()
{
    scanf関数(" %S "、S + 1 )。
    LEN = STRLEN(S + 1 )。
    以下のためにint型私は= 1 ; I <= LEN; I ++ 
        合計[S [i]を - ' A ' ] ++ ;
}

ボイド(解決)
{
    INT Iは= 0、J = 25 ;
     ながら(I <J)// 毎回大きな奇数の交換に小さな
    {
         ながら(I <J &&(SUM [I]が&!1。 ))I ++ しばらく(I <J &&(SUM [J]&!1。 ))J、
        合計[I] ++ ;
        合計[J] - 
    }

    以下のために(私は= 0 ; iは<= 25 ; I ++ のための(J = 1 ; J <=和[I] / 2 ; J ++ 
        printf(" %のC "、I + ' ' )。

    以下のために(私は= 0 ; I <= 25 ; I ++ 場合(SUM [I]%2 
    printf(" %のC "、I + ' ' )。

    以下のために(私= 25 ; I> = 0 ; i-- (J = 1 ; J <=和[I] / 2 ; J ++ 
        printf(" %のC "、I + ' ' )。
    printf(" \ n個" );
}

int型のmain()
{
    その中に();
    解決する();
}

 

おすすめ

転載: www.cnblogs.com/Mingusu/p/11953821.html