书里并没有提及题,只是将做这道题所需要的部分信息给出:
给定长度为N的字符串S,要构造一个长度为N的字符串T。起初,T是一个空串,随后反复进行下列任意操作。
- 从S的头部删除一个字符,加到T的尾部.
- 从S的尾部删除一个字符,加到T的尾部.
目标是构造字典序尽可能小的字符串T.
INPUT
N=6
OUTPUT
S=”ACDBCB”
———-这里我是根据题意写的代码,POJ AC代码随后会给出
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int N;
scanf("%d",&N);
char *str=(char*)malloc(N*sizeof(char)+1),*Line=(char*)malloc(N*sizeof(char)+1);
memset(str,'\0',N*sizeof(char)+1);
memset(Line,'\0',N*sizeof(char)+1);
scanf("%s",str);
int t=N,j=0,i=0;
while(i!=t)
{
if(str[i]<str[t-1])
{
Line[j]=str[i];
i++;j++;
}
else
{
Line[j]=str[t-1];
t--;j++;
}
}
printf("%s\n",Line);
return 0;
}
原题OUTPUT
The least lexicographic string he can make. Every line (except perhaps the last one) contains the initials of 80 cows (‘A’..’Z’) in the new line.
AC代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;
int main()
{
int N;
scanf("%d",&N);
char *str=(char*)malloc(N*sizeof(char)+1),*Line=(char*)malloc(N*sizeof(char)+1);
memset(str,'\0',N*sizeof(char)+1);
memset(Line,'\0',N*sizeof(char)+1);
for(int m=0;m<N;m++)
scanf("\n%c",&str[m]);
int b=N-1,count=0,a=0;
while(a<=b)
{
bool left=false;
for(int i=0;a+i<=b;i++)
{
if(str[a+i]<str[b-i])
{
left=true;
count++;
break;
}
else if(str[a+i]>str[b-i])
{
left=false;
count++;
break;
}
}
if(left)putchar(str[a++]);
else putchar(str[b--]);
if(count % 80 == 0)
cout<<endl;
}
putchar('\n');
return 0;
}