看了题解找的规律之后,其实很简单,但是还是做了好久...
规律就是:2到len/2和len/2之后的合数位置上的字母都必须一样,其余的补全就好了,下标从1开始会比较方便!
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
bool is_prime(int x)
{
if(x == 1)
return false;
for(int i=2; i*i<=x; i++)
if(x % i == 0)
return false;
return true;
}
char s[1005];
int cnt[30];
char res[1005];
int main()
{
while(cin >> s)
{
memset(cnt, 0, sizeof(cnt));
memset(res, 0, sizeof(res));
int maxn=0;
int index=-1;
int flag=1;
int len = strlen(s);
if(len <= 3)
{
cout << "YES" << endl;
cout << s << endl;
continue;
}
for(int i=0; i<len; i++)
cnt[s[i]-'a']++;
for(int i=0; i<30; i++)
{
if(maxn < cnt[i])
{
maxn = cnt[i];
index = i;
}
}
char s2 = index+'a';
for(int i=1; i<=len; i++)
{
if(i >= 2 && i <= len/2 || i>len/2 && !is_prime(i))
{
res[i] = s2;
maxn--;
cnt[index]--;
}
if(maxn < 0)
{
flag=0;
break;
}
}
for(int i=1; i<=len; i++)
{
if(res[i] == 0)
{
for(int j=0; j<30; j++)
{
if(cnt[j])
{
res[i] = j + 'a';
cnt[j]--;
break;
}
}
}
}
if(!flag)
cout << "NO" << endl;
else
{
cout << "YES" << endl;
for(int i=1; i<=len; i++)
cout << res[i];
cout << res << endl;
}
}
return 0;
}