解题思路:利用字典树,用节点记录每个字符出现的次数,然后乘以长度就是N个字符串的最大公共前缀。详见代码。
Code:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int maxn = -1;
struct Node
{
Node *Lefts;//0作为左孩子
Node *Rights;//1作为右孩子
int data;//记录每个节点出现的次数
};
void build(char *s,Node *p)
{
Node *q ;
if(s[0]=='\0') return;//当字符串遍历完直接跳出
if(s[0]=='0')//0作为当前节点的左孩子
{
if(p->Lefts == NULL)
{
q = (Node*)malloc(sizeof(Node));
q->Lefts = NULL; q->Rights = NULL;
q->data = 0; p->Lefts = q;
}
(p->Lefts)->data++;
build(s+1,p->Lefts);//向左递归遍历
}
else if(s[0]=='1')
{
if(p->Rights == NULL)
{
q = (Node*)malloc(sizeof(Node));
q->Lefts = NULL; q->Rights = NULL;
q->data = 0; p->Rights = q;
}
(p->Rights)->data++;
build(s+1,p->Rights);//向右递归遍历
}
}
void search(Node *p,int j)//查询最大公共前缀
{
if(p->data*j>maxn) maxn = p->data*j;//j代表到达当前节点时的长度*当前节点的次数与最大值比较
if(p->Lefts != NULL) search(p->Lefts,j+1);//左递归
if(p->Rights != NULL) search(p->Rights,j+1);//右递归
}
int main()
{
//freopen("input.txt","r",stdin);
int n;
scanf("%d",&n);
Node *head = (Node*)malloc(sizeof(Node));
head->Lefts = NULL; head->Rights = NULL;
head->data = 0;
while(n--)
{
char str[210];
scanf("%s",str);
build(str,head);
}
search(head,0);
printf("%d\n",maxn);//输出最大值
}