回文构造机WA0pts求助!!!

严重怀疑题目没开SPJ…

3. 回文构造机

题目ID:3722必做题100分

最新提交:

Wrong Answer

0 分

历史最高:

Wrong Answer

0 分

时间限制: 1000ms

空间限制: 262144kB

题目描述

时间:1s 空间:256M

题目描述:

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

输入格式:

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

输出格式:

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

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

样例输入1:

abbaa

样例输出1:

1 ababa

样例输入2:

abc

样例输出2:

3 a b c

样例输入3:

aaabbbccc

样例输出3:

3 aba bcb cac

样例输入4:

z

样例输出4:

1 z

子任务一30分:|s|<=10

子任务二30分:|s|<=100

子任务三40分:|s|<=1000

提示:

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
int a[30];
int k;

int main(){
	cin>>s;
	if(s.size()==1){
		cout<<1<<endl<<s;
		return 0;
	}
	for(int i=0;i<s.size();i++){
		a[s[i]-96]++;
	}
	for(int i=1;i<=26;i++){
		if(a[i]%2==1){
			k++;
		}
	}
	cout<<k<<endl;
	//输出第一个回文串 
	for(int i=1;i<=26;i++){
		if(a[i]%2==0){
			for(int j=1;j<=a[i]/2;j++){
				cout<<(char)(i+96);
			}
		}
	}
	for(int i=1;i<=26;i++){
		if(a[i]%2==1){
			for(int j=1;j<=a[i];j++){
				cout<<(char)(i+96);
			}
			break;
		}
	}
	for(int i=1;i<=26;i++){
		if(a[i]%2==0){
			for(int j=1;j<=a[i]/2;j++){
				cout<<(char)(i+96);
			}
		}
	}
	cout<<endl;
	//第一个回文串消耗完所有偶数,并且将第一个奇数消耗完 
	for(int i=1;i<=26;i++){
		if(a[i]%2==0){
			a[i]=0;
		}
	}
	for(int i=1;i<=26;i++){
		if(a[i]%2==1){
			a[i]=0;
			break;
		}
	}
	for(int i=1;i<=26;i++){
		if(a[i]!=0){
			for(int j=1;j<=a[i];j++){
				cout<<(char)(i+96);
			}
			cout<<endl;
		}
	}
	return 0;
}
/*

*/
1 个赞

如果 k = 0,那么要cout 1

回文串个数至少是1啊,因为s串长度至少是1

@杨思越 当k=0时,你会输出0,但实际有1,所以要特判

我明白了,等我改下

最新代码:WA0pts

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
int a[30];
int k;

int main(){
	cin>>s;
	if(s.size()==1){
		cout<<1<<endl<<s;
		return 0;
	}
	for(int i=0;i<s.size();i++){
		a[s[i]-96]++;
	}
	for(int i=1;i<=26;i++){
		if(a[i]%2==1){
			k++;
		}
	}
	if(k==0){
		cout<<1<<endl;
		for(int i=1;i<=26;i++){
			if(a[i]!=0){
				for(int j=1;j<=a[i]/2;j++){
					cout<<(char)(i+96);
				}
			}
		}
		for(int i=26;i>=1;i--){
			if(a[i]!=0){
				for(int j=1;j<=a[i]/2;j++){
					cout<<(char)(i+96);
				}
			}
		}
		return 0;
	}
	cout<<k<<endl;
	//输出第一个回文串 
	for(int i=1;i<=26;i++){
		if(a[i]%2==0){
			for(int j=1;j<=a[i]/2;j++){
				cout<<(char)(i+96);
			}
		}
	}
	for(int i=1;i<=26;i++){
		if(a[i]%2==1){
			for(int j=1;j<=a[i];j++){
				cout<<(char)(i+96);
			}
			break;
		}
	}
	for(int i=1;i<=26;i++){
		if(a[i]%2==0){
			for(int j=1;j<=a[i]/2;j++){
				cout<<(char)(i+96);
			}
		}
	}
	cout<<endl;
	//第一个回文串消耗完所有偶数,并且将第一个奇数消耗完 
	for(int i=1;i<=26;i++){
		if(a[i]%2==0){
			a[i]=0;
		}
	}
	for(int i=1;i<=26;i++){
		if(a[i]%2==1){
			a[i]=0;
			break;
		}
	}
	for(int i=1;i<=26;i++){
		if(a[i]!=0){
			for(int j=1;j<=a[i];j++){
				cout<<(char)(i+96);
			}
			cout<<endl;
		}
	}
	return 0;
}
/*

*/

造的几个样例都对了,现在严重怀疑没有SPJ

改A了


	for(int i=26;i>=1;i--){//这里也要倒着输出
		if(a[i]%2==0){
			for(int j=1;j<=a[i]/2;j++){
				cout<<(char)(i+96);
			}
		}
	}
	
}
/*


*/

1.麻烦解释一下改了哪里谢谢,不然我直接交上去老师判我抄袭
2.建议补药直接发AC代码谢谢

for(int i=26;i>=1;i--){//这里也要倒着输出
		if(a[i]%2==0){
			for(int j=1;j<=a[i]/2;j++){
				cout<<(char)(i+96);
			}
		}
	}

我不是说了在这里,你刚开始这是正输出的

谢谢,方案已给,管理关贴