nowcoder_G 小明不希望太简单_string_鸽笼定理
// G 小明不希望太简单_string_鸽笼定理
// 7ms 本来还担心超时
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
char s[N];
int cnt[333];
struct A
{
char ch;
int cnt;
A( char ch,int cnt ):ch(ch),cnt(cnt) {}
bool operator < ( const A& in ) const
{
return in.cnt > cnt ;
}
};
priority_queue<A> q;
int main()
{
int i,pos,cnt1,cnt2,tt;
char ch1,ch2,ch;
scanf("%s",s);
for( i=0;s[i];i++ ) cnt[s[i]]++; //
for( i='a';i<='z';i++ )
if( cnt[i] )
q.push( A( (char)i,cnt[i] ) );
pos=0;
while( q.size()>=2 )
{
ch1=q.top().ch; cnt1=q.top().cnt; q.pop();
ch2=q.top().ch; cnt2=q.top().cnt; q.pop();
s[pos++]=ch1;
s[pos++]=ch2;
cnt1--;
cnt2--;
if( cnt1 ) q.push( A( ch1,cnt1 ) );
if( cnt2 ) q.push( A( ch2,cnt2 ) );
}
for( i=0;i<pos;i++ ) putchar( s[i] );
if( !q.empty() ) // 偶数时恰好输出完 奇数时恰好只剩一个字母
{
ch=q.top().ch;
tt=q.top().cnt; // cnt 命名冲突
while( tt-- )
{
putchar( ch );
}
}
putchar('\n');
return 0;
}