【题目】
获取敌情
TimeLimit:1000MS MemoryLimit:128MB
64-bit integer IO format:%lld
Problem Description
在公元4484年,人类展开了对外界星球的征途和探索,但也不可避免的展开了和外星人之间的战争。偶然的机遇之下,美国联邦调查局截获了一串来自外星球的信息。但不知道有什么特殊的意义。所以就委托你,人类世界仅存的Acmer来破解这串神秘的信息。 所截获这条信息是长度为N的字符串Str,要重新组合成一个长度同样为N的字符串Ttr。Ttr一开始是一个空串。 重新组合的规则如为:每次从Str的字符串的头部或者尾部去除一个字符,并且接到Ttr的尾部。重复操作,直到Str为空串,Ttr为长度为N的字符串。 破解这条信息的关键在于要构造字典序尽可能小的字符串。 字典序:是指从前到后比较两个字符串大小的方法。首先比较第一个字符。如果不同则第一个字符较小的字符串更小,如果相同继续比较第二个字符串,来比较整个字符串的大小。 加油吧,聪明的Acmer,拯救人类的重担就靠你们了
Input
输入包含多组样例。 首先输入整数N(1<=N<=1000) 然后输入字符串Str(仅含有大写字母)
Output
对于每一组测试案例,在每一行输出破解后的字符串Ttr。
SampleInput
6 ACDBCB 6 DDABDD 6 DDBADD
SampleOutput
ABCBCD DDABDD DDABDD
【题解】
需考虑相等的时候优先选择哪一边。
【代码】
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a) memset(a,0,sizeof(a))
#define go(i,a,b) for(int i=a;i<=b;i++)
#define og(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
main()
{
int n,l,r;
string a;
while(cin>>n)
{
cin>>a;
l=0,r=n-1;
while(l<r)
{
if(a[l]<a[r]) cout<<a[l],l++;
else if(a[l]>a[r]) cout<<a[r],r--;
else
{
int x=l+1,y=r-1;
while(a[x]==a[y]&&x<y)
{
x++,y--;
}
if(a[x]<a[y])
cout<<a[l++];
else
cout<<a[r--];
}
}
cout<<a[l]<<endl;
}
}