组织一棵Trie
记录每个节点有多少串经过
统计最大值
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=50010*2+10;
typedef long long ll;
struct Trie
{
int ch[maxn][2];
int tot[maxn];
int sz;
int idx(char c)
{
return c-'0';
}
void clear()
{
sz=1;
memset(tot,0,sizeof tot);
memset(ch,0,sizeof ch);
}
void insert(char *s)
{
int u = 0,n=strlen(s);
tot[0]++;
for(int i = 0; i < n; ++i) {
int c=idx(s[i]);
if(!ch[u][c]) {
memset(ch[sz],0,sizeof ch[sz]);
ch[u][c]=sz++;
}
u=ch[u][c];
tot[u]++;
}
}
ll query(int u,int depth)
{
ll temp=depth*tot[u];
for(int i = 0; i < 2;++i) {
if(ch[u][i]) {
temp=max(query(ch[u][i],depth+1),temp);
}
}
return temp;
}
};
char c[250];
Trie trie;
int main()
{
int t;
scanf("%d",&t);
while(t--) {
int n;
trie.clear();
scanf("%d",&n);
for(int i = 0; i < n; ++i) {
scanf("%s",c);
trie.insert(c);
}
printf("%lld\n",trie.query(0,0));
}
return 0;
}