UVA 11488 Hyper Prefix Sets (Trie)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 11488 Hyper Prefix Sets (Trie)相关的知识,希望对你有一定的参考价值。

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2483


Hyper Prefix Sets


Prefix goodness of a set string islength of longest common prefix*number of strings in the set.For example the prefix goodness of theset {000,001,0011} is 6.You are given a set of binarystrings. Find the maximum prefixgoodness 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 withn(≤50000) the number of strings. Eachof the next n lines contains a string containing only 0 andMaximum length of each of thesestring is 200.


Output

For each test case output the maximumprefix goodness among all possible subsets of n binarystrings.


Sample Input

4

4

0000

0001

10101

010

2

01010010101010101010

11010010101010101010

3

010101010101000010001010

010101010101000010001000

010101010101000010001010

5

01010101010100001010010010100101

01010101010100001010011010101010

00001010101010110101

0001010101011010101

00010101010101001


Output for Sample Input

6

20

66

44


Problem Setter : Abdullah Al Mahmud

Special Thanks : Manzurur Rahman Khan


题意:
给出N个字符串,要求选出若干个,使得选中的字符串的公共前缀长度与选中字符串的个数的乘积最大。


分析:
简单粗暴的Trie模板题。


对于Tire中的每个结点加入两个信息:该结点的深度及该结点杯訪问的次数。最后求出这两个信息的最大值即可了,边加入字符串边维护即可。


/*
 *
 * Author : fcbruce
 *
 * Time : Sat 04 Oct 2014 09:17:50 PM CST
 *
 */
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>
#define sqr(x) ((x)*(x))
#define LL long long
#define itn int
#define INF 0x3f3f3f3f
#define PI 3.1415926535897932384626
#define eps 1e-10

#ifdef _WIN32
  #define lld "%I64d"
#else
  #define lld "%lld"
#endif

#define maxm 2
#define maxn 5000007

using namespace std;

struct Trie
{
  int ch[maxn][maxm];
  int deep[maxn];
  int cnt[maxn][maxm];
  int MAX;
  int sz;

  Trie()
  {
    sz=1;
    deep[0]=0;
    MAX=0;
    memset(cnt[0],0,sizeof cnt[0]);
    memset(ch[0],0,sizeof ch[0]);
  }

  void clear()
  {
    sz=1;
    deep[0]=0;
    MAX=0;
    memset(cnt[0],0,sizeof cnt[0]);
    memset(ch[0],0,sizeof ch[0]);
  }

  int idx(const char ch)
  {
    return ch-‘0‘;
  }

  void insert(const char *s)
  {
    for (int i=0,j=0;s[i]!=‘\0‘;i++)
    {
      int c=idx(s[i]);
      if (ch[j][c]==0)
      {
        memset(ch[sz],0,sizeof ch[sz]);
        memset(cnt[sz],0,sizeof cnt[sz]);
        deep[sz]=i+1;
        ch[j][c]=sz++;
      }
      j=ch[j][c];
      cnt[j][c]++;
      MAX=max(MAX,deep[j]*cnt[j][c]);
    }
  }
}trie;

char str[233];

int main()
{
#ifdef FCBRUCE
  freopen("/home/fcbruce/code/t","r",stdin);
#endif // FCBRUCE

  int T_T;
  scanf("%d",&T_T);
  
  while (T_T--)
  {
    trie.clear();

    int n;
    scanf("%d",&n);
    
    for (int i=0;i<n;i++)
    {
      scanf("%s",str);
      trie.insert(str);
    }

    printf("%d\n",trie.MAX);
  }


  return 0;
}


以上是关于UVA 11488 Hyper Prefix Sets (Trie)的主要内容,如果未能解决你的问题,请参考以下文章

UVA 11488 Hyper Prefix Sets 字典树

UVa 11488 超级前缀集合(Trie的应用)

UVA 4855 Hyper Box

UVa 1519 Dictionary Size

UVa 1401 Remember the word

LeetCode14. Longest Common Prefix