最近彩虹岛上发生了一个可怕的事件,大魔王ZZY为了督促彩虹岛的岛民好好训练,把每个人的电子设备都给加了一个密码,英勇的彩虹岛岛民要和大魔王作斗争,于是迫使大魔王说出了一个长度为N(1≤N≤2000)的字符串S,然而最后的密码是由S中所有字母构成字典序最小的字符串T(起初T是一个空串)。但是要想知道最后的密码只能以下两种操作: ·从S的头部删除一个字符,加到T的尾部
·从S的尾部删除一个字符,加到T的尾部
目标是要构造字典序尽可能小的字符串
Input 第一行一个整数N(代表字符串S的长度) 接下来的2~N+1行是字符串S中的字母(只包含大写字母) Output 输出时每行最多80个字符
Sample Input
6 A C D B C BSample Output
ABCBCDCODE:
#include <iostream> using namespace std; int main() { int n,i; char a[2200],b[2200]; cin>>n; for(i=1; i<=n; i++) { cin>>a[i]; } int h,t,e=1; h=1; t=n; while(h!=t) { if(a[h]>a[t]) { b[e++]=a[t]; t--; } else if(a[h]<a[t]) { b[e++]=a[h]; h++; } else if(a[h]==a[t]) //遇到两个字符相等时,比较下一个,直到两个字符不相等时,输出较小的一端的一个字符。 { int hh=h,tt=t; while(a[hh]==a[tt]) { hh++; tt--; } if(a[hh]<a[tt]) { b[e++]=a[h]; h++; } else if(a[hh]>a[tt]) { b[e++]=a[t]; t--; } } } b[e++]=a[h]; for(i=1;i<e;i++) { cout<<b[i]; if(i%80==0) cout<<endl; } return 0; }