時限:1000ms 空間限制:131072K
題目鏈接https://nanti.jisuanke.com/t/39615
爲了給全球小學員打起信息安全“保護傘”,VIPKID 還建立了一套立體化的安全防禦體系,7×24 小時持續安全監控與應急響應等多項聯動,具備業界最高級別的數據安全保護標準。值得一提的是,VIPKID 也是行業業內唯一通過 ISO 國際信息安全體系認證、公安部信息安全等級保護三級認證的教育企業。
現在安全防禦體系就檢測到了一個小問題,需要你來幫忙解決其中有關“前驅與後繼”的這一部分,讓我們一起來守護小學員們的信息安全吧!請看題:
對於兩個長度相等的不同的合法括號序列 S,T,定義他們之間的大小關係等同於他們字典序的大小關係。
給定一個合法的括號序列 S,求出 S 的前驅與後繼。
S 的前驅:所有小於 S 的串中最大的一個。
S 的後繼:所有大於 S 的串中最小的一個。
數據保證存在前驅與後繼。
輸入格式
一行一個合法括號序列 S。
輸出格式
第一行一個合法括號序列 pre
,表示前驅。
第二行一個合法括號序列 suf
,表示後繼。
數據規模
0<∣S∣≤1000000
樣例輸入
(()())()((()))()
樣例輸出
(()())()((())()) (()())()(()(()))
。。。。。這題過水了直接求一下上一個排列,判斷合法性,接着求下一個排列判斷合法性就沒了,全程套個STL的求排列就沒了,就不多說了。當然官方的正解我是。。。。有點想不到:
前驅:找一個盡量靠後的位置pos,使得pos這個位置上是一個左括號,且pos − 1這個位置上 是一個右括號。則前驅中pos − 1之前與原串相同,pos − 1這個位置是左括號,pos這個位置 是右括號,pos之後的位置在保證合法的前提下盡量使右括號靠前。
後繼:找一個盡量靠後的位置pos,使得pos這個位置是一個左括號,pos + 1這個位置是一個 右括號,且交換這兩個位置得到的括號序列依然合法。則後繼中pos之前的位置與原串相同, pos這個位置是右括號,pos + 1這個位置是左括號,pos + 1之後的位置在保證合法的前提下 盡量使左括號靠前。
以下是AC代碼:
#include <bits/stdc++.h>
using namespace std;
const int mac=1e6+10;
char s[mac],s1[mac];
bool check(char *s)
{
int len=strlen(s);
int head=0;
for (int i=0; i<len; i++){
if (s[i]=='(') head++;
else head--;
if (head<0) return 0;
}
return 1;
}
int main()
{
scanf ("%s",s);
int len=strlen(s);
for (int i=0; i<len; i++)
s1[i]=s[i];
prev_permutation(s1, s1+len);
while (!check(s1))
prev_permutation(s1, s1+len);
printf ("%s\n",s1);
next_permutation(s, s+len);
while (!check(s))
next_permutation(s, s+len);
printf ("%s\n",s);
return 0;
}