UVA 11488,Hyper Prefix Sets,Trie树

来源:互联网 发布:电话轰炸软件下载 编辑:程序博客网 时间:2024/05/16 04:42

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 stringis 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


题意:给定一个字符串集合S,定义P(S)为所有字符串的公共前缀长度与S中字符串个数的乘积,比如P({000,001,0011}) = 6.给N个01串,从中选出一个集合S,使得P(S)最大。

思路:将所有字符串构建trie图。每跑一个点,都要计数~同时该点的计数*目前跑的长度。不断更新这个积的最大值。就是答案。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define maxn 1000080char str[208];inline int max(int a,int b){return a>b?a:b;}struct Trie{int ch[maxn][2];int val[maxn];int sz;void init(){sz = 1;memset(ch[0],0,sizeof(ch[0]));}int idx(char c){return c - '0';}int insert(char * s){int ans = 0;int u = 0,len = strlen(s);for(int i = 0;i < len;i++){int c = idx(s[i]);if(!ch[u][c]){memset(ch[sz],0,sizeof(ch[sz]));val[sz] = 0;ch[u][c] = sz++;}u = ch[u][c];val[u]++;ans = max(ans,val[u]*(i+1));}return ans;}}trie;int main(){//freopen("in.txt","r",stdin);int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);trie.init();int ans = 0;for(int i = 1;i <= n;i++){scanf("%s",str);ans = max(ans,trie.insert(str));}printf("%d\n",ans);}return 0;}



0 0
原创粉丝点击