题目:
- Problem Description
- 某天,jq突发奇想,想到了这么一道水题。
- 给定一个由字母组成的字符串S,将其排序为回文串。
- 推荐使用scanf
- gets会读到行末的\r,因为是在windos在造的数据
- Input
- 多组测试数据
- 每组数据第一行包含一个字符串S。
- 1<=strlen(S)<=10000
- (样例已修改,对不起大家了)
- Output
- 输出重新排序后,字典序最小(按ASCII码的大小)的回文串,若无法排序为回文串,则输出"Impossible"。
- SampleInput
- aBaB abc
- SampleOutput
- BaaB Impossible
此水题,不发博客,天理难容!
- #include<cstdio>
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<sstream>
- typedef long long ll;
- using namespace std;
- const int maxn=10000+10;
- const int mod=1e9+7;
- //贪心从字典序小的字符中两个两个取,
- //凑成一对塞到头尾,
- //最后判一下有几个落单的,
- //只有一个有塞到中间,有多个输出Impossible
- int main(){
- char a[maxn];
- char c[maxn];
- int b[53];
- while(scanf("%s",a)!=EOF){
- int len1=strlen(a);
- sort(a,a+len1);
- memset(b,0,sizeof(b));
- for(int i=0;i<len1;i++){
- if(isupper(a[i]))b[a[i]-'A']++;
- else
- b[a[i]-'G']++;
- }
- int zilen;
- int k=0;
- int judge=0;
- /*for(int i=0;i<52;i++){
- printf("%d",b[i]);
- }
- printf("\n");*/
- for(int i=0;i<len1;){
- if(isupper(a[i]))zilen=b[a[i]-'A'];//个数
- else
- zilen=b[a[i]-'G'];
- int halfzilan=zilen/2;
- while(halfzilan!=0){
- c[k++]=a[i];
- halfzilan--;
- }
- if(zilen%2!=0){
- judge++;
- c[len1/2]=a[i];
- }
- i+=zilen;
- }
- //printf("%d\n",k);
- if(judge==1){
- for(int i=k+1;i<len1;i++){
- c[i]=c[len1-1-i];
- }
- for(int i=0;i<len1;i++){
- printf("%c",c[i]);
- }
- printf("\n");
- }
- else if(judge==0){
- for(int i=k;i<len1;i++){
- //printf("%c ",a[len1-1-i]);
- c[i]=c[len1-1-i];
- }
- for(int i=0;i<len1;i++){
- printf("%c",c[i]);
- }
- printf("\n");
- }
- else
- puts("Impossible");
- }
- return 0;
- }