题目大意:给出若干个01串,定义P(S)为这个串的集合的某个公共前缀的长度乘有这个公共前缀的字符串个数,求最大的P(S)。
用trie树存字符串,val[u]表示结点u有多少个字符串可称为公共前缀,最终dfs求出答案。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXNODE 10000010
#define SIZE 2
int ch[MAXNODE][SIZE];
int val[MAXNODE];
char datin[1100];
int siz,max;
void trie_insert(void);
void dfs(int now,int u);
int main(void)
{
int i,n,pi,qi;
scanf("%d",&pi);
for(qi=0;qi<pi;qi++)
{
scanf("%d",&n);
ch[0][0]=ch[0][1]=0;
for(i=1;i<=n;i++)
{
scanf("%s",datin+1);
trie_insert();
}
max=0;
dfs(0,0);
printf("%d\n",max);
}
return 0;
}
void dfs(int now,int u)
{
if(val[now]*u>max)
{
max=val[now]*u;
}
if(ch[now][0]!=0)
{
dfs(ch[now][0],u+1);
}
if(ch[now][1]!=0)
{
dfs(ch[now][1],u+1);
}
}
void trie_insert(void)
{
int i,j,lo,now;
lo=strlen(datin+1);
now=0;
for(i=1;i<=lo;i++)
{
j=datin[i]-'0';
if(ch[now][j]==0)
{
siz++;
ch[siz][0]=ch[siz][1]=0;
ch[now][j]=siz;
val[siz]=0;
}
now=ch[now][j];
val[now]++;
}
}