2019計蒜之道複賽-E-撐起信息安全“保護傘”(合法字符串的前驅與後繼)

時限: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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章