題意:有很多字串(24),選出一些字串,要求這些字串的字母都是偶數次;
分析:暴力2^24也很大了,中途相遇法;其原理就是一分為二,兩組解組成問題的解;
考慮到,每個字串出現的次數沒什麼關係,只要關於他的奇偶,那麼就有二進位制,1出現奇數次,0偶數次;
每乙個字串對應於乙個a位向量,
在前半個表中,選擇一些字串(2^12),又得到乙個位向量 x,要是表中存在,則選擇 字串個數較多者;
然後列舉下半個表,要是表map中有對應的向量,就說麼這兩組解會構成乙個滿足題意的解,
1 #include 23using
namespace
std;45
const
int maxn = 24
;6 maptable;78
//二進位制有多少個1
9int bitcount(int
x) 13
1415
16int
main()
1729}30
31table.clear();
32int n1 = n/2,n2 = n -n1;
33for(int i=0;i<(1
<)
39if(!table.count(x)||bitcount(table[x])40 table[x] = i; //
字串集合 x 對應的哪些字串41}
4243
int ans = 0;44
for(int i=0;i<(1
<)
5253 printf("
%d\n
",bitcount(ans));
54for(int i=0;i)
55if(ans&(1
<56 printf("
%d ",i+1
);57 puts(""
);5859}
6061
return0;
62 }
HDU 5936 中途相遇法
題目位址 這道題關鍵在於f y,k y可以拆成f a,k f b,k a1e5 b 我們就把y的1e9範圍降到了1e5 然後我們可以對前一半1e5個數枚舉出x f a,k a1e5 然後對於後一半1e5個數用二分找到有多少和f b,k b相同的就是個數。注意當x等於零的時候會有a 0,b 0的情況,...
UVA 10125 中途相遇法
題意 給定乙個整數集合,找出最大的d,使得a b c d,a,b,c,d是集合中不同的元素 思路 如果單純的列舉a,b,c的複雜度是o n 3 的,為了降低複雜度,可以先把a b的情形都找出來,然後再列舉d和c,是否符合要求 ac include include include include in...
hdu4963 中途相遇
將序列分成兩半,各n各字元。對於前一半,列舉每個字元屬於t1還是t2,共2 n種情況。在乙個方案中,t1的子串行為a,t2的子串行為b,我們假定a的長度不大於b的長度。顯然,a是b的字首才符合要求。令c b a,即b去掉a字首後剩餘的部分。同理,處理後一半得到乙個c 就是去掉相同字尾後剩餘的部分。當...