傳送門此題o
(n2l
)' role="presentation" style="position: relative">o(n
2l)o
(n2l
)模擬肯定是會超時的(l為所有字串總長)
我們想到對字串進行一定的預處理,可以快速計算匹配
我們設每乙個(的值為1,)的值為-1,規定
若只有)括號多了x個,則l[i]=r[i]=-x<0
若只有(括號多了x個,則l[i]=r[i]=x>0
那麼如何求l[i],r[i]的值呢?
從左到右掃瞄字串,用乙個變數cnt,統計和
則cnt的最小值=l[i],最終的值=r[i]
若(和)都有多餘,則必須接兩個字串,不符合條件,所以計算時應該直接跳過這些字串,不用考慮
要理解這句話,請看下面的模擬過程
)()
字串下標(0開始) 0 1 2
cnt值 -1 0 -1
l[i]=-1,說明左邊需要乙個(括號來匹配 (>=0即不需要)
r[i]=-1,說明右邊不需要(<=0即不需要),而左邊需要乙個(括號
我們以all[i]來hash,雜湊表的第 x位儲存了所有r[i]=x的字串的l[i]
但要注意的是,由於負數的原因,陣列下標要人為加上乙個數addv來儲存
為了防止一對字串被算兩次,我們規定字串只能接在右邊,我們列舉字串時要先保證l[i]>=0才能接,而l[i]<0的只能接在其他字串右邊
對於乙個l[i]>=0的字串i,我們尋找接在它右側能匹配的字串,所以我們在雜湊表的−r
[i]' role="presentation" style="position: relative">−r[
i]−r
[i]位置尋找l[i]值為−r
[i]' role="presentation" style="position: relative">−r[
i]−r
[i]的字串
比如:()(的l[i]=0,r[i]=1,我們則要尋找r[i]=l[i]=-1,即只多了乙個)括號的字串
用二分查詢統計值為−r
[i]' role="presentation" style="position: relative">−r[
i]−r
[i]的字串的個數,答案+=值為−r
[i]' role="presentation" style="position: relative">−r[
i]−r
[i]的字串的個數
預處理時間複雜度o(
l)' role="presentation" style="position: relative">o(l
)o(l
) (l為所有字串總長)
二分查詢時間複雜度o(
nlog
2l)' role="presentation" style="position: relative">o(n
log2
l)o(
nlog
2l)
#include
#include
#include
#include
#include
#define addv 300005
#define maxn 2*addv
using
namespace
std;
int n;
char str[maxn];
int cnt;
int l[maxn];
int r[maxn];
vector
table[maxn];
int main()
r[i]=cnt;
table[r[i]+addv].push_back(l[i]);//hash,為了防止負數人為加上addv,addv就相當於新的零點
}for(int i=1;iif(table[i].size()!=0) sort(table[i].begin(),table[i].end());//排序,為了二分查詢
long
long ans=0;
for(int i=1;i<=n;i++)
}printf("%i64d\n",ans);
}
python 仿函式 C 仿函式
c 的標準庫stl裡面有6大部件,其中之一為仿函式。初始看到這一名字可能讓人摸不著頭腦 函式倒是挺容易理解,何故又起個仿函式的名字呢?本文將帶你揭開它看起來挺讓人迷惑但是實際上很簡單的面紗。仿函式,看名字就知道它肯定和函式有什麼關聯,但是也肯定和函式有什麼區別。函式主要是一塊接收輸入引數然後按照一定...
仿函式 C 中仿函式的應用
仿函式 c 中仿函式的應用 在使用仿函式的時候,主要用到以下兩種 一種是以基類std unary function派生出來的派生類 另一種是以基類std binary function派生出來的派生類。而這兩種有什麼區別呢?它們之間的區別只是第一種接收的引數個數為乙個,而第二種接收的引數的個數為兩個...
C 之仿函式
一 仿函式 仿函式說白了就是類中過載 函式運算子,就可以把類物件當成乙個函式來使用 先舉個例子 class pow int main 結果如下圖 可以看到類中過載了 就可以pow類的物件當成函式一樣來使用。一 仿函式的應用 仿函式主要應用於stl和模板,這裡舉個stl的例子 class cmp in...