C. 字符串重排
时间限制 1000 ms
内存限制 65536 KB
题目描述
给定一个字符串,求它的一个重排,使得没有两个相邻字符相同。
输入格式
第一行一个整数t,表示组数(t<10)。接下来的t行,每行一个字符串s,s中只包含小写字母,s的长度不大于1e5.
输出格式
若符合条件的重排存在,输出字典序最小的一个。
若不存在,输出-1。
输入样例
2
aabbccdd
aaaaabcd
输出样例
ababcdcd
-1
慢慢处理即可,比较费事<pre name="code" class="cpp">#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
char s[100005];
int cnt[26];
int main()
{
int t,i;
scanf("%d",&t);
while(t--){
scanf("%s",s);
int n=strlen(s),maxcnt=0;
memset(cnt,0,sizeof(cnt));
for(i=0;s[i];i++)
maxcnt=max(maxcnt,++cnt[s[i]-'a']);
if(maxcnt>(n+1)/2) {printf("-1\n");continue;}
int pre=-1;
while(n){
int flag=0,ti=-1;
for(i=0;i<26;i++){
if((n&1)&&cnt[i]==(n+1)/2)
flag=1,ti=i;
if(!flag&&cnt[i]&&ti==-1&&i!=pre) ti=i;
}
if(flag) {printf("%c%s",ti+'a',n==1?"\n":"");cnt[ti]--;pre=ti;}
else {printf("%c%s",ti+'a',n==1?"\n":"");cnt[ti]--;pre=ti;}
n--;
}
}
return 0;
}