I - Playing With Stringshttps://vjudge.csgrandeur.cn/problem/Gym-101020I
丹尼和迈克是两个孩子,他们整天玩游戏,当他们找不到游戏玩的时候,他们就发明一个游戏。有一个小时左右到达学校,因为他们爱玩串丹尼发明了一个游戏,谁是第一个形成回文字符串,用这个字符串的所有字母,根据以下示例规则:1-玩家可以重新排列字母组成一个字符串。2-所形成的字符串必须是回文,并且使用给定字符串的所有字母。3-如果有多个字符串,选择字典序最小的字符串。例如:字符串是“abacb”玩家可以形成:“abcba”和“bacab”,但“abcba”是字典序最小的。迈克让你写一个程序来计算回文字符串,这样他就可以打败丹尼了。
输入
您的程序将在一个或多个测试用例上进行测试。输入的第一行将是单个整数T,测试用例的数量(1≤T≤1000)。每一行的测试用例包含一个字符串,字符串的长度不超过1000个小写英文字母。
输出
对于每个测试用例,根据上面的规则打印一行包含字典序最小的回文字符串。如果没有这样的字符串打印"impossible"
思路:
记录每个字母出现的次数,如果有两个及其以上种类的字母的数量是奇数,就不可能形成回文串,如果有一个是奇数,那么把其中一个放在中间(当然左右两边要对称),这样就可以形成回文串。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,n;
char a[1010];
cin>>t;
while(t--)
{
cin>>a;
n=strlen(a);
int b[150]={0};
for(int i=0;i<n;i++)
{
b[a[i]]++;//记录每个字母出现的数量
}
int c=0,flag=0;
for(int i='a';i<='z';i++)
{
if(b[i]%2!=0)
{
flag=i;//中间需要打印的字母
c++;//出现奇数的个数
}
}
if(c>1)
cout<<"impossible"<<endl;
else
{
for(int i='a';i<='z';i++)//打印左边
{
for(int j=0;j<b[i]/2;j++)
{
printf("%c",i);
}
b[i]=b[i]/2;
}
if(c==1)//打印中间
printf("%c",flag);
for(int i='z';i>='a';i--)//打印右边
{
for(int j=0;j<b[i];j++)
{
printf("%c",i);
}
}
cout<<endl;
}
}
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
string s;
scanf("%d",&t);
while(t--)
{
int b[150]={0},flag,c=0;
cin>>s;
for(int i=0;i<s.size();i++)
{
b[s[i]]++;
}
for(int i='a';i<='z';i++)
{
if(b[i]%2)
{
c++;
flag=i;
}
}
if(c>1)
printf("impossible\n");
else
{
for(int i='a';i<='z';i++)
{
for(int j=0;j<b[i]/2;j++)
{
printf("%c",i);
}
}
if(c==1)
printf("%c",flag);
for(int i='z';i>='a';i--)
{
for(int j=0;j<b[i]/2;j++)
{
printf("%c",i);
}
}
printf("\n");
}
}
}
//2022/8/16