10 11T2 折半搜尋

2022-05-01 18:39:10 字數 1687 閱讀 8724

交錯的字串

(string.cpp)

【問題描述】

mark douglas是一名律師。他的客戶yuri ball在一場車禍中不幸去世。為了幫助yuri的親屬拿到他的遺產,mark需要得到乙個密碼。在yuri的筆記本上,有乙個長為2n的只包含小寫字母的字串,mark知道密碼恰好是將這個字串分解為兩個長度為n的子串行且它們構成的字串恰好相反的方案數。我們認為兩種分解方法是不同的,當且僅當兩個下標集合構成的集合是不同的,注意和我們認為是相同的分解方法。如cabaacba的合法分解共有cabaacbacabaacba兩種。mark希望你能幫助他計算出密碼,事成之後他決定分給你six million five hundred thousand dollars並邀請你去柬埔寨度假。

【輸入格式】

輸入檔名為string.in

第一行為乙個正整數n。

第二行為乙個長度為2n的字串,僅包含小寫字母。

【輸出格式】

輸出檔名為string.out

輸出僅一行表示答案。

【樣例輸入與輸出】

example_string1.in

example_string1.out

cabaacba

更多樣例請見example/string/目錄。

【資料範圍】

對於1~7號測試點(28%):n<=10。

對於8~10號測試點(12%):字串中僅有小寫字母a。

對於11~14號測試點(16%):字串中除去兩個b外其餘全是a。

對於15~18號測試點(16%):字串中僅有a, b兩種字元。

對於所有測試點(100%):n<=18。

這個資料範圍容易使人想到折半搜尋。

我們將字串分為前後兩部分。如果前半部分中搜得的字首串為,那麼後半部分中搜得的字尾串必須為,且為有序對。

對於兩側分別列舉每個字元的歸屬情況,hash後用map計數即可。

code:

1 #include2 #include3 #include

4 #include5 #include6

using

namespace

std;

7string

s,s1,s2;

8 mapcheck;

9long

long

ans,n;

10int

main()

20reverse(s2.begin(),s2.end());

21 check[s1+'

^'+s2]++;22}

23for(int i=0;i)

30reverse(s1.begin(),s1.end());

31 ans+=check[s1+'

^'+s2];32}

33 cout<2;34

return0;

35 }

over

查詢演算法2 折半查詢

從小到大排列的有序序列。折半查詢的演算法描述如下 將待查詢元素與表中間的元素進行比較,如果兩者相等,則說明查詢成功 否則利用中間位置將表分成兩部分,如果待查詢元素小於中間位置的元素值,則繼續與前乙個子表的中間位置元素記性比較 否則與後乙個子表的中間位置元素進行比較。不斷重複上述操作,直到找到與待查詢...

P2962(折半搜尋 狀壓)

題目 挺新奇的一題,用二進位制對應位來表示是第幾個燈,同時也用二進位制來表示對燈的操作,將和這個燈相連的那些燈全部置一,其他置零,那麼我們對某個燈進行操作就只需要和這個燈相異或。比如,0號燈和1,3兩個燈相連,二進位制表示出來就是00 0001011,由於和1相異或狀態取反,和0相異或狀態不變,我們...

poj 2785 折半列舉 二分搜尋

傳送門 problem 2785 題意 給定 n 行數,每行都有 4 個數a,b,c,d。要從每列中各抽取出乙個數,問使四個數的和為0的所有方案數。相同數字不同位置當作不同數字對待。題解 如果採用暴力的話,從4個數列中選擇數組合,共有 n 4 種選擇,故時間複雜度為o n 4 指定會超時。但,如果將...