1478 括號序列的最長合法子段

2022-04-11 02:40:35 字數 1699 閱讀 6477

1478 括號序列的最長合法子段

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 難度:4級演算法題

這裡有另乙個關於處理合法的括號序列的問題。

如果插入「+」和「1」到乙個括號序列,我們能得到乙個正確的數學表示式,我們就認為這個括號序列是合法的。例如,序列"(())()", "()"和"(()(()))"是合法的,但是")(", "(()"和"(()))("是不合法的。

這裡有乙個只包含「(」和「)」的字串,你需要去找到最長的合法括號子段,同時你要找到擁有最長長度的子段串的個數。

input

第一行是乙個只包含「(」和「)」的非空的字串。它的長度不超過 1000000。

output

輸出合格的括號序列的最長子串的長度和最長子串的個數。如果沒有這樣的子串,只需要輸出一行「0  1」。

input示例

)((())))(()())

output示例

6 2//括號匹配,將 ( 做 1 , ) 為 -1 ,就可以得到一串數字,求出字首和,那麼,字首和相同,並且,又端點的值是區間中最小的,即為合法序列,用單調棧維護乙個上公升字首和即可。

1 # include 2

using

namespace

std;

3 # define ll long

long

4 # define inf 0x3f3f3f3f

5 # define mx 1000056/*

************************

*/7 # define buf_size 1000005

8 # define out_size 1000005

9bool ioerror=0;10

11 inline char

nc()

16//17}

18return *p1++;19}

20 inline bool blank(char ch)

21 inline void read(int &x)

29 inline void read(char *s)

3637

const

int n=1000005;38

struct

node;

42char

str[n];

43int

sum[n];

44int

ans[n];

4546

intmain ()

4754 stackst;

55 st.push((node));

56 ans[0]=1;57

for (int i=1;i<=len;++i)

5867

int ch = i-tp.dex;

68 ans[ch]++;

69st.push(tp);70}

71else

st.push((node));72}

73int mdex=0;74

for (int i=1;i<=len;++i)

75if (ans[i]) mdex=i;

76 printf("

%d %d\n

",mdex,ans[mdex]);

77return0;

78 }

view code

1478 括號序列的最長合法子段(模擬棧)

這裡有另乙個關於處理合法的括號序列的問題。如果插入 和 1 到乙個括號序列,我們能得到乙個正確的數學表示式,我們就認為這個括號序列是合法的。例如,序列 和 是合法的,但是 和 是不合法的。這裡有乙個只包含 和 的字串,你需要去找到最長的合法括號子段,同時你要找到擁有最長長度的子段串的個數。輸入第一行...

51Nod 1478 括號序列的最長合法子段

acm模版 一拿到題,就想到了乙個十分低階的做法,先正著遍歷一遍,遍歷過程中再倒著遍歷 one 不負眾望,tle了四組資料。無奈,想了一下,只好使用棧來實現了,先預處理一遍,將括號匹配在一起,然後檢索最長串即可 two one tle include include const int maxn 1...

51nod 1478 括號序列的最長合法子段

原題鏈結 1478 括號序列的最長合法子段 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 這裡有另乙個關於處理合法的括號序列的問題。如果插入 和 1 到乙個括號序列,我們能得到乙個正確的數學表示式,我們就認為這個括號序列是合法的。例如,序列...