UVA

1、给n个只含0、1的串,求出这些串中前缀的最大和。

例1:

0000

0001

10101

010

结果:6(第1、2串共有000,3+3=6)

例2:

01010010101010101010

11010010101010101010

结果:20(第1串的长度为20)

2、用trie树(字典树)来做,插入的时候统计前缀出现次数,并更新最大前缀和(前缀出现次数*前缀长度)。

3、

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

const int MAX=2;
int ans;//最大前缀和

struct Trie
{
    Trie *next[MAX];
    int num[MAX];//此前缀出现次数
};

void createTrie(char *str,Trie *root)
{
    int temp;
    int len = strlen(str);
    Trie *p = root, *q;
    for(int i=0; i<len; ++i)
    {
        int id = str[i]-'0';
        if(p->next[id] == NULL)
        {
            q = new Trie;
            for(int j=0; j<MAX; ++j)
            {
                q->next[j] = NULL;
                q->num[j]=0;
            }
            p->next[id] = q;

        }
        ++p->num[id];//前缀出现次数+1
        temp=p->num[id]*(i+1);
        if(temp>ans)
            ans=temp;//更新最大前缀和
        p = p->next[id];
    }
}

int main()
{
    char str[205];
    int T,n,i;

    scanf("%d",&T);
    while(T--)
    {
        Trie *root=new Trie;
        for(i=0; i<MAX; i++)
        {
            root->next[i]=NULL;
            root->num[i]=0;
        }

        ans=0;//最大前缀和初始化
        scanf("%d",&n);
        for(i=0; i<n; ++i)
        {
            scanf("%s",str);
            createTrie(str,root);//插入到字典树
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/gongpixin/p/4940692.html