#include "bits/stdc++.h"
using namespace std;
const int N=4e5+10,M=125;
int mp[M],ans;
vector<char>ss;
int n;string s;
int check(){
int j=0;
while(true)
{
ans=ss.size();
int c=(n-ans)>>1;
if(c%ans==0)//每组多少对.
return c;
while(j<M&& !mp[j])
j++;
mp[j]--;
ss.push_back(char(j));
ss.push_back(char(j));
}
}
int main(){
memset(mp,0,sizeof(mp));
cin>>n>>s;
for (int i = 0; i <n ; ++i) {
mp[s[i]]++;
}
for(int i=0;i<M;i++)
{
if(mp[i]%2)
ss.push_back(char(i));
mp[i]/=2;
}
if(ss.size()==0)
{
cout<<1<<endl;
string B="";
for(int j=0;j<M;j++)
for(int k=0;k<mp[j];k++)
B+=char(j);
string C=B;
reverse(C.begin(),C.end());
B+=C;
printf("%s\n",B.c_str());
return 0;
}
int c=check(),j=0;
cout<<ans<<endl;
for (int i = 0; i <ans ; ++i) {
char x=ss[i];
int d=c/ans;
string B="";
while (1){
while(j<M&& !mp[j]) j++;
if (mp[j]>=d){
for(int k=0;k<d;k++)
B+=char(j);
mp[j]-=d,d=0;
break;
}
else {
for(int k=0;k<mp[j];k++)
B+=char(j);
d-=mp[j],mp[j]=0;
}
}
string C=B;
reverse(C.begin(),C.end());
B=B+x+C;
printf("%s ",B.c_str());
}
}
1430C - Numbers on Whiteboard | 1697B - Promo |
208D - Prizes Prizes more Prizes | 659A - Round House |
1492C - Maximum width | 171B - Star |
1512B - Almost Rectangle | 831B - Keyboard Layouts |
814A - An abandoned sentiment from past | 268C - Beautiful Sets of Points |
1391C - Cyclic Permutations | 11A - Increasing Sequence |
1406A - Subset Mex | 1365F - Swaps Again |
50B - Choosing Symbol Pairs | 1719A - Chip Game |
454B - Little Pony and Sort by Shift | 1152A - Neko Finds Grapes |
1719B - Mathematical Circus | 1719C - Fighting Tournament |
1642A - Hard Way | 285C - Building Permutation |
1719E - Fibonacci Strings | 1696C - Fishingprince Plays With Array |
1085A - Right-Left Cipher | 1508B - Almost Sorted |
1690C - Restoring the Duration of Tasks | 1055A - Metro |
1036D - Vasya and Arrays | 1139C - Edgy Trees |