LA 2965 中途相遇法

2022-04-01 07:18:01 字數 1046 閱讀 3816

題意:有很多字串(24),選出一些字串,要求這些字串的字母都是偶數次;

分析:暴力2^24也很大了,中途相遇法;其原理就是一分為二,兩組解組成問題的解;

考慮到,每個字串出現的次數沒什麼關係,只要關於他的奇偶,那麼就有二進位制,1出現奇數次,0偶數次;

每乙個字串對應於乙個a位向量,

在前半個表中,選擇一些字串(2^12),又得到乙個位向量 x,要是表中存在,則選擇 字串個數較多者;

然後列舉下半個表,要是表map中有對應的向量,就說麼這兩組解會構成乙個滿足題意的解,

1 #include 2

3using

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 就是去掉相同字尾後剩餘的部分。當...