字典树每个节点维护这个节点的深度和到达这里的字符串数量,用这两个的乘积维护答案即可。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int idx(char c){
return c-'0';
}
struct node{
int bt[2];
int num;
int deep;
}G[1000000];
int sz=1;
int res=0;
void Insert(char s[]){
int len=strlen(s);
int cur=0;
for(int i=0;i<len;i++){
int k=idx(s[i]);
if(!G[cur].bt[k]){
G[cur].bt[k]=sz;
G[sz].deep=G[cur].deep+1;
sz++;
}
cur=G[cur].bt[k];
G[cur].num++;
res=max(res,G[cur].num*G[cur].deep);
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int N;
scanf("%d",&N);
sz=1;res=0;
memset(G,0,sizeof(G));
for(int i=0;i<N;i++){
char s[205];
scanf("%s",s);
Insert(s);
}
printf("%d\n",res);
}
return 0;
}
/*
4
4
0001
0000
10101
010
2
01010101010101
11010101010101
3
010101010101010
010101010101000
010101010101010
*/