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