2014 UESTC Training for Data Structures——J 方师傅的01串

解题思路:利用字典树,用节点记录每个字符出现的次数,然后乘以长度就是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);//输出最大值
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值