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 1000080
char 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;
}