交錯的字串
(string.cpp)
【問題描述】
mark douglas是一名律師。他的客戶yuri ball在一場車禍中不幸去世。為了幫助yuri的親屬拿到他的遺產,mark需要得到乙個密碼。在yuri的筆記本上,有乙個長為2n的只包含小寫字母的字串,mark知道密碼恰好是將這個字串分解為兩個長度為n的子串行且它們構成的字串恰好相反的方案數。我們認為兩種分解方法是不同的,當且僅當兩個下標集合構成的集合是不同的,注意和我們認為是相同的分解方法。如cabaacba的合法分解共有cabaacba和cabaacba兩種。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 #include4 #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 指定會超時。但,如果將...