傳送門
開始一直不知道怎麼寫
但是可以列舉a
aa串的右端點和b
bb串的左端點
然後可以一直把a
aa串向左擴充套件,b
bb串向右擴充套件
而且因為dis
disdi
s是個單增函式,所以一旦大於m
mm就可以直接跳出
但這樣沒有優化複雜度,仍然是o(n
3)
o(n^3)
o(n3)
究其原因,是因為列舉端點就花了o(n
2)
o(n^2)
o(n2)
但是對於a串和b串,如果a串向右延伸,b向左延伸
最後會交於他們的對稱軸,我們可以列舉這根對稱軸
設對稱軸左邊是mid
midmi
d,對稱軸右邊是mid
+1
mid+1
mid+1
那麼當前a串區間是[mi
d,mi
d]
[mid,mid]
[mid,m
id],b串區間是[mi
d+1,
mid+
1]
[mid+1,mid+1]
[mid+1
,mid
+1]
如果要維持對稱軸不變,要麼a左端點左移乙個長度,b右端點右移乙個長度
要麼a右端點左移乙個長度,b左端點右移乙個長度
那 麼這
樣就是一
個尺取的
過程,因
為dis
是乙個不
減函
數\color那麼這樣就是乙個尺取的過程,因為dis是乙個不減函式
那麼這樣就是
乙個尺取
的過程,
因為di
s是乙個
不減函式
#include
using
namespace std;
const
int maxn =
5009
;char s[maxn]
;int t,n,m;
void
solve
(int i,
int x,
int&ans)
else
//太大了,縮小 }}
intmain()
}
HDU 6103 列舉 尺取
題意 給出乙個字串,問兩個不相交的字串對稱相減的絕對值和小於等於 m的最長長度。思路 如果存在兩個不相交的字串,那麼必然兩個字串之間存在對稱軸,分為兩種 1.子串之間有奇數個其它字元,那麼列舉其中的字元。2.子串之間有偶數個其它字元,那麼列舉其中的空格。對稱軸確定之後,對對稱的串計算出其對稱相減的和...
HDU 4334 尺取 思維
題意 在5個陣列中,每個陣列中取乙個數,5個數之和是否為0 第一次我是用map標記前3個陣列的和,然後暴力跑後兩個陣列的迴圈,果然t了。網上又兩種做法 處理前三個陣列的和,後兩個陣列的和,排序 列舉 二分。我自己沒試過不知道能過不 t n 3 n 2 log n 3 log n 2 n 2 log ...
HDU 6231 (二分 尺取)
所求的一定是a陣列中的原素,這點毋庸置疑,所以在a陣列中任意選則其中的乙個數x,若a的所有長度不小於k的連續子串行中第k大數不小於x的子串行一共有ans個,那麼x在所有第k大元素組成的數列中至少是第ans大數 因為ans n r,因為之前的x已經是第k大了,所以加上後面的元素,如果比他小,則沒有影響...