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

2021-07-23 07:47:23 字數 1135 閱讀 1904

原題鏈結

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

codeforces

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

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

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

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

input

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

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

)((())))(()())
output示例

6 2
設dp[i]表示以str[i]為結尾的最長合法字串, 若str[i] == ') && str[i-1] == '(', 那麼dp[i] = 2, 如果dp[i-2]大於0那麼dp[i] += dp[i-2]

若str[i-1] != '('那麼k = i - dp[i-1] - 1;若str[k] == '(那麼dp[i] = 2 + dp[i-1]; 不要忘記dp[i] += dp[k-1]

#include #include #include #include #include #define maxn 1000005

using namespace std;

typedef long long ll;

char str[maxn];

int dp[maxn];

int main()

else

}} if(dp[i] > maxs)

else if(dp[i] == maxs)

} if(maxs == 0)

else

printf("%d %d\n", maxs, cnt);

return 0;

}

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

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

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

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

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

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