• 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]!='';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
    ",trie.MAX);
      }
    
    
      return 0;
    }
    


  • 相关阅读:
    HDU 1013 Digital Roots
    HDU 1290 献给杭电五十周年校庆的礼物
    几何分割问题
    HDU 1222 Wolf and Rabbit
    HDU 1997 汉诺塔VII
    HDU 1443 Joseph
    HTML的标题样式
    HDU 1568 Fibonacci
    Hope
    HDU 1071 The area
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6991186.html
Copyright © 2020-2023  润新知