Description
FJ打算帶他的N(1 <= N <= 30,000)頭奶牛去參加一年一度的“全美農場主大獎賽”。在這場比賽中,每個參賽者都必須讓他的奶牛排成一列,然後領她們從裁判席前依次走過。
今年,競賽委員會在接受隊伍報名時,採用了一種新的登記規則:他們把所有隊伍中奶牛名字的首字母取出,按它們對應奶牛在隊伍中的次序排成一列(比如說,如果FJ帶去的奶牛依次爲Bessie、Sylvia、Dora,登記人員就把這支隊伍登記爲BSD)。登記結束後,組委會將所有隊伍的登記名稱按字典序升序排列,就得到了他們的出場順序。
FJ最近有一大堆事情,因此他不打算在這個比賽上浪費過多的時間,也就是說,他想盡可能早地出場。於是,他打算把奶牛們預先設計好的隊型重新調整一下。
FJ的調整方法是這樣的:每次,他在原來隊列的首端或是尾端牽出一頭奶牛,把她安排到新隊列的尾部,然後對剩餘的奶牛隊列重複以上的操作,直到所有奶牛都被插到了新的隊列裏。這樣得到的隊列,就是FJ拉去登記的最終的奶牛隊列。
接下來的事情就交給你了:對於給定的奶牛們的初始位置,計算出按照FJ的調整規則所可能得到的字典序最小的隊列。
Input
- 第1行: 一個整數:N
- 第2…N+1行: 第i+1行僅有1個’A’…'Z’中的字母,表示隊列中從前往後數第i頭奶牛名字的首字母
Output
- 第1…??行: 輸出FJ所能得到的字典序最小的隊列。每行(除了最後一行)輸出恰好80個’A’…'Z’中的字母,表示新隊列中每頭奶牛姓名的首字母
Sample Input
6
A
C
D
B
C
B
Sample Output
ABCBCD
Data Constraint
Hint
【樣例解釋】
操作數 | 原隊列 | 新隊列
#1 | ACDBCB
#2 | CDBCB | A
#3 | CDBC | AB
#4 | CDB | ABC
#5 | CD | ABCB
#6 | D | ABCBC
#7 | ABCBCD
//written by zzy
題目大意:
給你個字符串,可以從頭或尾取一個字符依次插入新串,求如何使新串字典序最小。
題解:
不難發現可以貪心,用兩個指針
若頭尾不同則取小的,若相同則同時往求前跳直至不同爲止,再取小的那邊的第一個頭/尾
(因爲相同時取後面小的一定可以使字典序最小)
顯然這是暴力,但與滿分做法思路一樣,
只是預處理出前後綴再用字符串hash或直接後綴自動機就行了
這裏給出暴力代碼
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 30005
using namespace std;
int i,j,n,m,head,tail,p,q,num;
int c[N];
int main()
{
scanf("%d\n",&n);
for (i=1;i<=n;i++)
scanf("%c\n",&c[i]);
head=1,tail=n;
while (head<=tail) {
if (c[head]<c[tail]) printf("%c",c[head++]); else
if (c[head]>c[tail]) printf("%c",c[tail--]); else {
p=head,q=tail;
while (p<q-1&&c[p]==c[q]) p++,q--;
if (c[p]<c[q]) printf("%c",c[head++]);
else printf("%c",c[tail--]);
}
num++;
if (num%80==0) printf("\n");
}
}