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 #include23 #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。它們都以空字元為結束標記,他們在遇到空字...