2012-12-02 13:30:58Morris

[UVA][BinaryTrie] 11488 - Hyper Prefix Sets

H

Hyper Prefix Sets

 

 

Prefix goodness of a set string is length of longest common prefix*number of strings in the set. For example the prefix goodness of the set {000,001,0011} is 6.You are given a set of binary strings. Find the maximum prefix goodness among all possible subsets of these binary strings.

Input
First line of the input contains T(≤20) the number of test cases. Each of the test cases start with n(≤50000) the number of strings. Each of the next n lines contains a string containing only 0 and 1. Maximum length of each of these string is 200.

Output
For each test case output the maximum prefix goodness among all possible subsets of n binary strings.

Sample Input                             Output for Sample Input

4

4

0000

0001

10101

010

2

01010010101010101010

11010010101010101010

3

010101010101000010001010

010101010101000010001000

010101010101000010001010

5

01010101010100001010010010100101

01010101010100001010011010101010

00001010101010110101

0001010101011010101

00010101010101001

 

6

20

66

44

 

 


Problem Setter : Abdullah Al Mahmud
Special Thanks : Manzurur Rahman Khan

建一個二元的字典數,查找每個節點的深度乘上經過次數的最大值即可。

#include <stdio.h>
struct ND {
    int l, r, cnt;
};
ND BUF[1000000];
int ans;
void sol(int nd, int dep) {
    if(BUF[nd].l)
        sol(BUF[nd].l, dep+1);
    if(BUF[nd].r)
        sol(BUF[nd].r, dep+1);
    if(dep*BUF[nd].cnt > ans)
        ans = dep*BUF[nd].cnt;
}
int main() {
    int t, n, i, j;
    char bin[205];
    scanf("%d", &t);
    while(t--) {
        scanf("%d ", &n);
        int size = 0, idx;
        BUF[0].l = BUF[0].r = BUF[0].cnt = 0;
        for(i = 0; i < n; i++) {
            gets(bin);
            idx = 0;
            for(j = 0; bin[j]; j++) {
                if(bin[j] == '0') {
                    if(BUF[idx].l == 0) {
                        BUF[idx].l = ++size;
                        BUF[size].l = BUF[size].r = BUF[size].cnt = 0;
                    }
                    idx = BUF[idx].l;
                } else {
                    if(BUF[idx].r == 0) {
                        BUF[idx].r = ++size;
                        BUF[size].l = BUF[size].r = BUF[size].cnt = 0;
                    }
                    idx = BUF[idx].r;
                }
                BUF[idx].cnt++;
            }
        }
        ans = 0;
        sol(0, 0);
        printf("%d\n", ans);
    }
    return 0;
}