题目来源:UVa 11488 Hyper Prefix Sets
题意:求公共前缀的长度与有该前缀的字符串的数量的乘积的最大值
思路:对于字典树很清楚的可以马上做出来 建树时直接取节点数量和节点深度的乘积的最大值
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int val;
node *next[2];
node()
{
val = 0;
for(int i = 0; i < 2; i++)
next[i] = NULL;
}
};
node *root;
int ans;
void insert(char *s)
{
int n = strlen(s);
node *curr = root;
for(int i = 0; i < n; i++)
{
int c = s[i] - '0';
if(curr->next[c] == NULL)
{
node *newnode = new node;
curr->next[c] = newnode;
}
curr = curr->next[c];
curr->val++;
ans = max(ans, (curr->val)*(i+1));
}
}
void find(char *s)
{
int n = strlen(s);
node *curr = root;
for(int i = 0; i < n; i++)
{
int c = s[i] - 'a';
if(curr->next[c] == NULL)
return;
curr = curr->next[c];
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
ans = 0;
root = new node;
int n;
scanf("%d", &n);
while(n--)
{
char s[222];
scanf("%s", s);
insert(s);
}
printf("%d\n", ans);
}
return 0;
}