LA2965字串合併

2022-09-15 22:45:25 字數 2112 閱讀 1536

la2965

【題目描述】:給定n個大寫字母組成的連續字串,(n<=24),選取其中的m個組合,使相同的大寫字母的出現次數之和為偶數。目標是讓這個m最大。

【演算法分析】:

ps:這道題看著比較簡單,但是編碼有難度。

【中途相遇法】:

首先,如果將每種狀態用位表示,就是2^24種狀態,1表示奇數個,0表示偶數個。利用異或運算的特殊性,模二加,奇數與奇數異或是偶數。所以我們的目的是找出m個數異或,使他們的結果為0。到這裡為止,已經保證了編碼的簡便性。

但是,複雜度任然是難以支撐。樸素的演算法為2^24(==16000000)種情況,超時。書中提供「中途相遇法」,將考慮的情況分為兩半,一邊是2^12(==4096)種,因為兩個數異或,只有完全相等,才能為0。所以生成前半部分的「選取個數」(我們只關注這個)和「異或結果」的匹配的集合map。後半部分,每次生成乙個新的匹配的時候,查詢用nlog2(n)的複雜度即可。精髓在於「打表+查詢」?

【綜合複雜度】:2* 2^24+24*log2(24)約等於10000

【完整**】:

1 #include2

3 #include4

5 #include

67 #include8

9 #include10

11 #include12

13 #include14

15 #include16

17 #include

1819 #include20

21#define maxn 100+5

2223

#define maxm 100+5

2425

#define oo 1e9

2627

#define eps 0.001

2829

#define pi acos(-1.0)//

這個精確度高一些

3031

#define rep1(i,n) for(int i=0;i<=(n);i++)

3233

#define rep2(i,n) for(int i=1;i<=(n);i++)

3435

#define drep2(i,n) for(int i=(n);i>=1;i--)

3637

#define ll long long

3839

using

namespace

std;

4041

4243

int nums[maxn];//

表示統計的異或的結果

4445

intn;

4647

intp1,p2;

4849 mapmap;

5051

//int getbits(int x)

5253

//66

67//

return ans;

6869//}

7071

7273

int getbits(int x)//

這個統計位數的函式值得學習

7475

8081

void

readin()

8283

102103

return

;104

105}

106107

108109

void

makemap()

110111

132133

return

;134

135}

136137

void

getans()

138139

172173

174175

}176

177}

178179 cout180181

if (ans>0

)182

183194

195196

197 cout<198199

return

;200

201}

202203

intmain()

216217

return0;

218219 }

字串1 字串的旋轉

題目描述 給定乙個字串,要求將字串前面的若干個字元移到字串的尾部。例如 將字串 abcdef 的前三個字元 a b c 移到字串的尾部,那麼原字串將變成 defabc 首先想到的是將需要移動的字元乙個乙個移到字串的尾部。實現如下 public class transfet s n 1 t publi...

字串(一) 字串Hash

今天開一手最不 tao 擅 yan 長的字串演算法 字串hash演算法。似乎提到字串的話,kmp應該是更為常見的一種,但是hash有它的優點,被犇們稱為 優雅的暴力 何謂hash?hash的中文稱為雜湊,這當然是音譯,直譯過來就是雜湊,或者也有叫預對映的。雜湊的作用就是通過某個特殊函式的對映,將任意...

18 字串 char型字串

1 什麼是字串?字串是以空字元 0 結尾的字元陣列。空字元的assii碼為 0,空格的ascii碼為32 2 0的作用 0 是乙個空字元標誌,它的assii碼為0,c 有好多處理字串的函式,都以 0 為結束標記。也就是以空字元為結束標記,比如cin,cout。它們都以空字元為結束標記,他們在遇到空字...