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 : 分隔相同字符的主要内容,如果未能解决你的问题,请参考以下文章

hiho一下 第148周

hiho一下 第173周

hiho一下 第150周 -- Demo Day (DP)

hiho一下 第174周

hiho一下 第172周

hihoCoder 第255周 hiho一下 Queen Attack