hiho一下 第165周#1327 : 分隔相同字符
Posted zqifa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hiho一下 第165周#1327 : 分隔相同字符相关的知识,希望对你有一定的参考价值。
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个只包含小写字母‘a‘-‘z‘的字符串 S ,你需要将 S 中的字符重新排序,使得任意两个相同的字符不连在一起。
如果有多个重排后字符串满足条件,输出字典序最小的一个。
如果不存在满足条件的字符串,输出INVALID。
输入
字符串S。(1 ≤ |S| ≤ 100000)
输出
输出字典序最小的答案或者INVALID。
样例输入
aaabc
样例输出
abaca
c语言代码:
#include<stdio.h> #include<string.h> char s[100010]; int az[27]; char work(int x,int y,char a) { int i,j,k,l; j=0; k=y/2; l=y%2; for(i=0;i<26;i++) { if(az[i]>k+l) { return ‘ ‘; }else if(az[i]==k+l) { if(l==1) { s[x]=i+‘a‘; az[i]--; return i+‘a‘; } /*else { j=0; while(az[j]==0 || j+‘a‘==a)j++; s[x]=j+‘a‘; az[j]--; return j+‘a‘; }//*/ } } j=0; while(az[j]==0 || j+‘a‘==a)j++; s[x]=j+‘a‘; az[j]--; return j+‘a‘; } int main() { int i,j,k,l,L; char c; while(gets(s)!=NULL) { L=l=strlen(s); memset(az,0,sizeof(az)); for(i=0;i<l;i++)az[s[i]-‘a‘]++; //for(j=0;j<26;j++)if(az[j]>0)printf("%c%d ",j+‘a‘,az[j]); //printf("\n"); k=0; c=‘ ‘; for(i=0;i<L;i++) { c=work(i,l,c); l--; if(c==‘ ‘)k=1; //for(j=0;j<26;j++)if(az[j]>0)printf("%c%d ",j+‘a‘,az[j]); //printf("\n"); } if(k==0)printf("%s\n",s);else printf("INVALID\n"); } return 0; }
c++代码:
#include<iostream> #include<cstring> char s[100010]; int letters[27]; using namespace std; char deal_str(int num,int l,char c) { int max,i,j,k; i=l%2; max=(l+1)/2; for(k=0;k<26;k++){ if(letters[k]>max){ return ‘ ‘; }else if(letters[k]==max){ if(i==1){ s[num]=k+‘a‘; letters[k]--; return k+‘a‘; } } } j=0; while(letters[j]==0 || j+‘a‘==c){ j++; } s[num]=j+‘a‘; letters[j]--; return j+‘a‘; } int main(){ int i,n,l,err; char c; while(cin>>s){ n=l=strlen(s); memset(letters, 0, sizeof(letters)); for(i = 0; i < n; ++i){ letters[s[i] - ‘a‘]++; } err=0; c=‘ ‘; for(i=0;i<n;i++) { c=deal_str(i,l,c); l--; if(c==‘ ‘){ err = 1; } } if(err==0){ cout<<s<<endl; }else { cout<<"INVALID"<<endl;; } } return 0; }
c语言代码:
#include<stdio.h>
#include<string.h>
char s[100010];
int az[27];
char work(int x,int y,char a)
{
int i,j,k,l;
j=0;
k=y/2;
l=y%2;
for(i=0;i<26;i++)
{
if(az[i]>k+l)
{
return ‘ ‘;
}else if(az[i]==k+l)
{
if(l==1)
{
s[x]=i+‘a‘;
az[i]--;
return i+‘a‘;
}
/*else
{
j=0;
while(az[j]==0 || j+‘a‘==a)j++;
s[x]=j+‘a‘;
az[j]--;
return j+‘a‘;
}//*/
}
}
j=0;
while(az[j]==0 || j+‘a‘==a)j++;
s[x]=j+‘a‘;
az[j]--;
return j+‘a‘;
}
int main()
{
int i,j,k,l,L;
char c;
while(gets(s)!=NULL)
{
L=l=strlen(s);
memset(az,0,sizeof(az));
for(i=0;i<l;i++)az[s[i]-‘a‘]++;
//for(j=0;j<26;j++)if(az[j]>0)printf("%c%d ",j+‘a‘,az[j]);
//printf("\n");
k=0;
c=‘ ‘;
for(i=0;i<L;i++)
{
c=work(i,l,c);
l--;
if(c==‘ ‘)k=1;
//for(j=0;j<26;j++)if(az[j]>0)printf("%c%d ",j+‘a‘,az[j]);
//printf("\n");
}
if(k==0)printf("%s\n",s);else printf("INVALID\n");
}
return 0;
}
c++代码:
#include<iostream>
#include<cstring>
char s[100010];
int letters[27];
using namespace std;
char deal_str(int num,int l,char c)
{
int max,i,j,k;
i=l%2;
max=(l+1)/2;
for(k=0;k<26;k++){
if(letters[k]>max){
return ‘ ‘;
}else if(letters[k]==max){
if(i==1){
s[num]=k+‘a‘;
letters[k]--;
return k+‘a‘;
}
}
}
j=0;
while(letters[j]==0 || j+‘a‘==c){
j++;
}
s[num]=j+‘a‘;
letters[j]--;
return j+‘a‘;
}
int main(){
int i,n,l,err;
char c;
while(cin>>s){
n=l=strlen(s);
memset(letters, 0, sizeof(letters));
for(i = 0; i < n; ++i){
letters[s[i] - ‘a‘]++;
}
err=0;
c=‘ ‘;
for(i=0;i<n;i++)
{
c=deal_str(i,l,c);
l--;
if(c==‘ ‘){
err = 1;
}
}
if(err==0){
cout<<s<<endl;
}else {
cout<<"INVALID"<<endl;;
}
}
return 0;
}
以上是关于hiho一下 第165周#1327 : 分隔相同字符的主要内容,如果未能解决你的问题,请参考以下文章