UVA 11488-Hyper Prefix Sets(trie树+DFS)

题目大意:给出若干个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]++;
	}
}
    原文作者:Trie树
    原文地址: https://blog.csdn.net/dilemma729/article/details/43926211
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞