Try Again

UVA 11488 Hyper Prefix Sets (字典树)

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

给定一个字符串集合S, 定义P(S)为所有字符串的公共前缀长度与S中字符串个数的乘积, 例如P{000, 001, 0011} = 6,

现在给出n个只包含字符01的串(n <= 50000), 从中选出一个子集合S, 使得P(S)最大, 求最大值

#include <iostream> 
#include <algorithm> 
#include <cstring> 
#include <cstdio>
#include <vector> 
#include <queue> 
#include <cstdlib> 
#include <iomanip>
#include <cmath> 
#include <ctime> 
#include <map> 
#include <set> 
using namespace std; 
#define lowbit(x) (x&(-x)) 
#define max(x,y) (x>y?x:y) 
#define min(x,y) (x<y?x:y) 
#define MAX 100000000000000000 
#define MOD 1000000007
#define pi acos(-1.0) 
#define ei exp(1) 
#define PI 3.141592653589793238462
#define ios() ios::sync_with_stdio(false)
#define INF 0x3f3f3f3f 
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
char s[250];
int ans,n,t,pos;
struct Trie
{
    int next[2];
    int cnt;
    void init()
    {
        cnt=0;
        memset(next,0,sizeof(next));
    }
}trie[10000006];
void init()
{
    for(int i=0;i<=n*10;i++ )
    {
        trie[i].init();
    }
}
void insert(char *s)
{
    int x=0;
    for(int i=0;s[i]!='\0';i++)
    {
        if(trie[x].next[s[i]-'0']==0)
        {
            trie[x].next[s[i]-'0']=++pos;
            trie[pos].init();
        }
        x=trie[x].next[s[i]-'0'];
        trie[x].cnt++;
        ans=max(ans,(i+1)*trie[x].cnt);
    }
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {

        ans=0,pos=0;
        scanf("%d",&n);
        init();
        for(int i=0;i<n;++i)
        {
            scanf("%s",s);
            insert(s);
        }
        printf("%d\n",ans);

    }
    return 0;
}

 

posted @ 2017-08-03 16:37  十年换你一句好久不见  阅读(162)  评论(0编辑  收藏  举报