列表

详情


NC21650. 牛牛与回文串

描述

牛牛非常喜欢回文串,他认为回文会给自己带来好运,有一天他看到一个字符串突发奇想,如果将这个字符串所有字符打乱,然后每次操作只能挑选若干个能构成回文串的字符组合成一个字符串,牛牛最少需要操作几次才能取完所有字符。

输入描述

输入一个字符串S,1 ≤ |s| ≤ 1000

输出描述

第一行输出一个整数K,表示回文串的个数

接下来K行每行输出一个回文串,要求输出的所有字符串的字符集合恰好是输入的S中的所有字符集合

示例1

输入:

abbaa

输出:

1
ababa

示例2

输入:

abc

输出:

3
a
b
c

示例3

输入:

aaabbbccc

输出:

3
aba
bcb
cac

示例4

输入:

z

输出:

1
z

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 43ms, 内存消耗: 6812K, 提交时间: 2023-08-06 18:14:30

def main():
    stro = input();
    digi_dict = {};
    ordlist = [];

    for digi in stro:
        digi_dict[digi] = digi_dict.get(digi,0) + 1;
    for digi in digi_dict.keys():
        if(digi_dict[digi]%2==1):
            ordlist.append(digi);
            digi_dict[digi] -= 1;
    if(len(ordlist)<=1):
        print(1);
    else:
        print(len(ordlist));

    mainstr = '';
    keylist = list(digi_dict.keys());
    M = len(digi_dict.keys());
    for i in range(M):
        mainstr += keylist[i]*(digi_dict[keylist[i]]//2);
    if(ordlist):
        mainstr += ordlist.pop();
    for i in range(M):
        mainstr += keylist[-i-1]*(digi_dict[keylist[-i-1]]//2);

    print(mainstr);
    for digi in ordlist:
        print(digi);

    return;

main();

C++ 解法, 执行用时: 4ms, 内存消耗: 460K, 提交时间: 2021-12-01 18:57:57

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+100;
char s[N];
int ans,num[N],a[N];

int main()
{
	scanf("%s",s);
	int n=strlen(s);
	for(int i=0;i<n;i++)
		num[(s[i]-'a'+1)]++;
	
	for(int i=1;i<=26;i++)
	{
		if(num[i]%2)
		{
			ans+=1;
			a[ans]=i;
		}
	}
	
	printf("%d\n",max(ans,1));
	for(int i=1;i<=26;i++)
	{
		int w=num[i]/2;
		for(int j=1;j<=w;j++)
			printf("%c",(i-1)+'a');
	}
	if(ans)
		printf("%c",a[1]-1+'a');
	for(int i=26;i>=1;i--)
	{
		int w=num[i]/2;
		for(int j=1;j<=w;j++)
			printf("%c",(i-1)+'a');
	}
	printf("\n");
	for(int i=2;i<=ans;i++)
		printf("%c\n",a[i]-1+'a');
	
	return 0;
}

上一题