[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;
}